2

使用 执行搜索后POST /session/{session id}/element,我从 Chrome 网络驱动程序中得到了这个:

{ sessionId: '3241e7da289f4feb19c1f55dfc87024b',
  status: 0,
  value: { ELEMENT: '0.12239552668870868-1' } }

这是规格要求吗?

我问是因为我找不到任何地方用大写字母清楚地写着“元素”。我在规范中只能找到一个名为的键value被设置(它是:它被设置为{ ELEMENT: '0.12239552668870868-1' }

  • 我可以一直期待其他浏览器的网络驱动程序的响应吗?也就是说,status总是sessionId返回?

  • 这就是{ ELEMENT: '0.12239552668870868-1' }铬构成物体的方式吗?或者对于任何网络驱动程序都是如此?当然,其他网络驱动程序返回什么?

4

2 回答 2

2

WebDriver-W3C Candidate Recommendation明确提到了以下几点:

  • Find Element 命令用于在当前浏览上下文中查找可用于将来命令的元素。
  • 让位置策略成为获得名为“使用”的属性的结果。
  • 让选择器成为获取名为“值”的属性的结果。
  • 获取带参数名称的属性的结果定义为与调用 Object 的结果相同。GetOwnProperty(propertyName).
  • GetOwnProperty(propertyName)ECMAScript® 语言规范中定义为:

字符串对象使用用于其他原生 ECMAScript 对象的GetOwnProperty内部方法的变体。这种特殊的内部方法提供了对与 String 对象的各个字符相对应的命名属性的访问。


浏览器特定实现

我用你提供的所有信息做了一个小测试,Search BoxGoogle Home Page所有https://www.google.co.in主要变体,WebDrivers结果如下:

  • ChromeDriver- OSS

    [[ChromeDriver: chrome on XP (0d24fd038bde751b1e411711271c3e69)] -> name: q]
    [[ChromeDriver: chrome on XP (0d24fd038bde751b1e411711271c3e69)] -> name: q]
    
  • FirefoxDriver- W3C

    [[FirefoxDriver: firefox on XP (e7a56813-97c5-466e-9c35-24c9f89af6ed)] -> name: q]
    [[FirefoxDriver: firefox on XP (e7a56813-97c5-466e-9c35-24c9f89af6ed)] -> name: q]
    
  • InternetExplorerDriver- W3C

    [[InternetExplorerDriver: internet explorer on WINDOWS (367257db-cdbc-4be7-aeac-805a21ad9d2d)] -> name: q]
    [[InternetExplorerDriver: internet explorer on WINDOWS (367257db-cdbc-4be7-aeac-805a21ad9d2d)] -> name: q]
    

因此,您可以从返回的相关字段的字段详细信息中观察到类似的模式,并且在WebDriver变体将正确的引用传递给用户之前,它不应该成为障碍。

最后,此时值得一提的是,与FirefoxDriverInternetExplorerDriver(均符合 W3C)一样,ChromeDriver几乎符合 W3C,并且可能在一些功能方面有所不同。


更新 A

根据您的问题和更新,您对ChromeDriverChrome通信协议非常正确。越来越细化,我们可以在webdriver调用中发现一些不同之处,如下所示:

  • 火狐:

    1516626575533   webdriver::server   DEBUG   <- 200 OK {"value":{"element-6066-11e4-a52e-4f735466cecf":"6e35faa4-233f-400c-a6c7-6a66b54a69e5"}}
    

因此,Firefox 浏览器返回:

"value":{"element-6066-11e4-a52e-4f735466cecf":"6e35faa4-233f-400c-a6c7-6a66b54a69e5"}
  • 铬合金 :

            [14.921][DEBUG]: DEVTOOLS RESPONSE Runtime.evaluate (id=25) {
       "result": {
          "type": "object",
          "value": {
             "status": 0,
             "value": {
                "ELEMENT": "0.7086986861512812-1"
             }
          }
       }
    }
    

因此,Chrome 浏览器返回:

"value": {"ELEMENT": "0.7086986861512812-1"}

对我们用户来说最重要的是浏览器对象返回的元素的值,它总是由用户引用并由webdriver实例正确识别。所有这些内部逻辑都变成abstract了最终用户。


更新 B

从@FlorentB 添加一些重要字节。的评论:

Selenium的早期版本,即Selenium v​​2.x使用关键字ELEMENT来存储DOM 树元素的引用。在Selenium的最新版本(即Selenium v​​3.x )中,此密钥已更改为element-6066-11e4-a52e-4f735466ce当前ChromeDriver的大部分实现仍然来自Selenium 2.x规范。

于 2018-01-22T12:03:26.570 回答
0

我刚刚遇到了同样的问题,发现在 Selenium 服务器和相关图像的 3.5 左右进行了更改。

我发现此评论最能具体了解更改并确定它更改的版本: https ://github.com/SeleniumHQ/selenium/issues/4773#issuecomment-333092149

我正在使用像 selenium/node-firefox:3.4.0-actinium 这样的 Docker 映像,并且发现 v3.4.0ELEMENT从旧的 JSonWire 规范返回密钥,而 v3.9element-6066-11e4-a52e-4f735466cecf从新的 WebDriver 规范返回格式。(我没有检查过任何其他版本)。

这是他们逐渐迁移到 WebDriver 的一部分,但有点令人困惑的是,他们在 3.5(或大约)而不是 v3.0.0 中进行了这一重大更改,我认为每个人都可以接受。

此外,“原生”驱动程序中也有混合实现,比如现在由 Firefox 团队生产的 Gecko 和 Chrome,因为它们将有不同的开发路线图。

此外,我发现我正在使用的客户端库甚至还没有实现新的响应,所以我不得不暂停一段时间(或者自己修补和 PR)。我在其他客户端(例如2 年前的 Java 客户端)中也看到过类似的对话。

您可以看到两种协议对 Element 响应的定义之间的差异:

https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#webelement-json-object

https://www.w3.org/TR/webdriver/#elements

于 2018-02-16T23:47:43.003 回答