网络驱动程序返回的值

Values returned by webdrivers

使用 POST /session/{session id}/element 执行搜索后,我从 Chrome webdriver 得到了这个:

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

这是the specs的需求吗?

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

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

  • “查找元素”命令用于在当前浏览上下文中查找可用于未来命令的元素。
  • 让位置策略成为获得名为 "using" 的 属性 的结果。
  • 让选择器成为获得名为 "value" 的 属性 的结果。
  • 获取带有参数名称的 属性 的结果定义为与调用 Object.GetOwnProperty(propertyName).
  • 的结果相同
  • GetOwnProperty(propertyName)ECMAScript® Language Specification 中定义为:

String objects use a variation of the GetOwnProperty internal method used for other native ECMAScript objects. This special internal method provides access to named properties corresponding to the individual characters of String objects.


浏览器特定实现

我用 Search BoxGoogle Home Page 提供的所有信息做了一个小测试,即 https://www.google.co.inWebDrivers 的所有主要变体,这里是结果:

  • 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]
    

因此,您可以从相关 value 字段的字段详细信息中观察到,返回的模式相似,直到 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 浏览器 returns :

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

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

因此,Chrome 浏览器 returns :

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

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


更新 B

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

The earlier versions of i.e. Selenium v2.x used the keyword ELEMENT to store the reference of a DOM Tree element. This key was changed within the recent versions of Selenium i.e. Selenium v3.x to element-6066-11e4-a52e-4f735466ce. Most of the implementation of the current ChromeDriver is still from the Selenium 2.x specifications.

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

我发现此评论最具体,可以理解更改并确定它在哪个版本中进行了更改: https://github.com/SeleniumHQ/selenium/issues/4773#issuecomment-333092149

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

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

在 "native" 驱动程序中也有混合实现,例如 Firefox 团队现在生产的 Gecko 和 Chrome,因为它们会有不同的开发路线图。

此外,我发现我正在使用的 client-side 库甚至还没有实现新的响应,所以我不得不等待一段时间(或者自己打补丁和 PR ).我在其他客户中看到过类似的对话(例如 Java client 2 years ago)。

可以看出两种协议对Element response定义的区别:

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

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