揭秘Selenium中的W3C WebDriver通讯协议

韩韩韩韩兵·2021-04-25 19:36
出品|51Testing软件测试网概述我们在学习Selenium的时候,经常会看到一个叫做JSON Wire

编者按:本文来自微信公众号“51Testing软件测试网”(ID:testing51testing),作者:平凡的码农,36氪经授权发布。

出品|51Testing软件测试网

概述 

我们在学习Selenium的时候,经常会看到一个叫做JSON Wire Protocol的协议。到底什么JSON Wire Protocol呢?

它定义了与browser driver通信的协议规范,带有RESTFUL风格,JSON+HTTP。

在最新的Selenium中这个协议已经被弃用,取而代之的是W3C WebDriver协议。

2018年6月5日,W3C浏览器测试和工具工作组(Browser Testing and Tools Working Group)发布WebDriver正式推荐标准(W3C Recommendation)。

不过后者是从前者衍生出来的,是对它的完善与扩展,协议的内容是非常的相似的。

JSON wire protocol的协议细节可以浏览如下网站:

https://github.com/seleniumhq/selenium/wiki/jsonwireprotocol

W3C Webdriver的协议细节可以浏览如下网站:

https://w3c.github.io/webdriver/

在上面Selenium的架构图中,我们可以看到JSON Wire Protocol的右侧分别是browser driver和real browser。那么是不是说我们可以不用Selenium而直接去操作browser driver从而操作真实的浏览器呢。

搭建测试环境 

测试环境还是比较简单的,这里我们选择edge作为被测浏览器,在测试机上我们需要安装:POSTMAN,Edge web driver还有edge浏览器。

从官网下载下载edge web driver (https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)

注意这里需要下载和edge浏览器版本一致的web driver。

W3C Webdriver协议分析 

运行Edge Browser Driver 

下载完成后,双击运行msedgedriver.exe运行。可以看到MSEdgeDriver打开了端口9515。

如果用浏览器访问这个端口会得到如下反馈,unknown command。这是因为浏览器向Edge Browser Driver发送的HTTP请求格式不对。

那么Edge Browser Driver需要什么格式的请求呢?其实这些请求都是有标准的,下面进一步介绍:W3C WebDriver标准。

W3C WebDriver标准 

我们可以想一下,在进行前端测试的时候,需要打开浏览器,用户登录,捕捉元素,模拟动作,截屏,最后关闭浏览器。那么这个W3C WebDriver协议规范中也要覆盖这些常用的接口。

在官方文档中这些接口大概分成如下部分:Capabilities、Sessions、Timeouts、Navigation、Contexts、Elements、Document、Cookies、Actions、User prompts、Screen capture。

想要了解更多的规范细节,可以访问官方网站:https://www.w3.org/TR/webdriver1/

这里从白皮书中摘要出部分命令。

POSTMAN测试 

下面,我们就用Postman做一个简单的测试:通过Postman让Edge webdriver打开百度网页。

首先,我们让Edge webdriver打开一个edge浏览器。Webdriver可以并行打开若干个浏览器,因此需要用会话的方式来管理每个浏览器,用sessionID来区分不同的浏览器。查询白皮书中提供的方法列表可知,创建session需要用post方法加上session URI即可。

那么POST请求中的body格式是什么呢,再从白皮书中查询数据格式:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

{    "capabilities":?{        "firstMatch":?[            {}        ],        "alwaysMatch":?{            "browserName":?"MicrosoftEdge",            "platformName":?"windows"        }    }} 

综合起来,我们发送的格式如下:

发送后得到200 OK,并且一个edge浏览器被打开。从响应中我们可以找到seesionID。

然后,我们再让浏览器打开百度,如法炮制,查询白皮书,这里需要用的命令格式post+/session/{session id}/url.,json数据格式为:{"url": "https://example.com"} 。

编辑好请求后,顺利的将百度通过Postman打开。

Selenium工作原理测试 

我们用Postman可以成功的操作浏览器了,那么Selenium是否也是这样工作的呢,我们进一步测试。

第一步,我们打开Wireshark,因为测试的数据发送与接收方都在本机,所以选择loopback网卡。

第二步,打开python运行如下代码:

可以看到百度网页被成功打开。

第三步,从Wireshark抓的包中过滤出webdriver的相关报文。这里先找到webdriver所使用的端口。在任务管理器中找到msedgedriver.exe的PID为‘8704’。

通过netstat -ano | find “8704”得到如下结果,可以看出webdriver使用的端口为4796。

所以,我们在Wireshark中添加的过滤条件为:tcp.port == 4796 and http,得到如下数据包。

很明显第一组为创建session,第二组为打开URL。之前使用postman发送的命令和这两组命令是一模一样的。感兴趣的话可以看看这一组请求的发送端口来自哪个程序?是不是python.exe。

小结 

之前看Selenium的框架不是很清楚,也不太明白它是如何与不同的浏览器进行通信的。

在做了这些测试以后,渐渐明白:只要各个浏览器厂家提供的browser driver遵循W3C发布的标准通讯协议,Selenium作为client与之通讯即可。

在开发语言上,Selenium client自然可以用任何语言实现,最初使用Java、C#、python等等,到现在的JavaScript。

最后再看一下这张架构图就觉得非常的明白了。

......

本文为51Testing软件测试网

第六十一期电子杂志内容

剩余精彩内容请点击下方 阅读原文查看

推荐阅读

点击阅读☞测试人,面试逃不过的灵魂三问

点击阅读☞测试中这些奇怪的问题你见过吗?

点击阅读☞新人如何做好功能测试,看这几点就够了

点击阅读☞211本科大佬的真实面试经历:测试人要不要去外包公司?

点击阅读☞2020年应聘华为测试岗三轮面试经历分享

戳 “阅读原文”一起来充电吧! 

+1
0

好文章,需要你的鼓励

参与评论
评论千万条,友善第一条
后参与讨论
提交评论0/1000

提及的项目

查看项目库
展开更多

下一篇

出品|51Testing软件测试网题记所谓“温故而知新”,近期把bugfree服务器的维护常识整理了一下,与

2021-04-25

36氪APP让一部分人先看到未来
36氪
鲸准
氪空间

推送和解读前沿、有料的科技创投资讯

一级市场金融信息和系统服务提供商

聚焦全球优秀创业者,项目融资率接近97%,领跑行业