51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4236|回复: 0
打印 上一主题 下一主题

[原创] 揭秘Selenium中的W3C WebDriver通讯协议

[复制链接]
  • TA的每日心情
    擦汗
    7 天前
  • 签到天数: 1027 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-4-25 09:38:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    概述
      我们在学习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/ ... ge/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网卡。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-10-7 05:21 , Processed in 0.069559 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表