webdrivers返回的值

时间:2018-01-21 16:54:44

标签: selenium webdriver chrome-web-driver

使用POST /session/{session id}/element执行搜索后,我从Chrome网络驱动程序中获取此信息:

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

这是the specs要求的吗?

我在问,因为我无法在任何地方找到一个清楚地说明的地方" ELEMENT"用大写字母。我在规范中找到的就是设置了一个名为value的密钥(它是:它被设置为{ ELEMENT: '0.12239552668870868-1' }

  • 我是否始终能够始终期待这种反应,来自其他浏览器' webdrivers?也就是说,statussessionId总是会返回吗?

  • 这是{ ELEMENT: '0.12239552668870868-1' }铬构成物体的方式吗?或者这适用于任何网络驱动程序?不是,其他网络驱动程序会返回什么?

2 个答案:

答案 0 :(得分:2)

正如您提到的WebDriver-W3C Candidate Recommendation,让我们看一下相关的部分。规范明确提到以下内容:

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

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

浏览器特定实施

我做了一个小测试,其中包含Search Box Google 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]

    value

因此,您可以从字段中观察到所返回的相关 WebDriver 字段的详细信息是类似的模式,直到FirefoxDriver变体传递给用户的正确引用它不应该不是障碍。

最后,值得一提的是,此时 InternetExplorerDriver ChromeDriver (两者都符合 W3C标准) ), ChromeDriver 仍然不符合符合W3C ,并且行为方面可能会有所不同。

更新A

根据您的问题和更新,您对 Chrome 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"}
    

因此,Firefox浏览器返回:

        [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"}
    

因此,Chrome浏览器返回:

webdriver

对我们用户最重要的是浏览器对象返回的元素的值,该值始终由用户引用并由abstract实例正确识别。所有这些内部逻辑变为Selenium给最终用户。

更新B

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

  

早期版本的Selenium v2.x DOM 使用关键字ELEMENT来存储 Selenium 元素。此密钥已在Selenium v3.x的最新版本中更改,即 ChromeDriver 更改为element-6066-11e4-a52e-4f735466ce。当前 Selenium 2.x 的大多数实现仍然来自{{1}}规范。

答案 1 :(得分:0)

我刚遇到同样的问题,发现更改是在大约3.5个Selenium服务器及相关图片上进行的。

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

我正在使用像selenium / node-firefox:3.4.0-actinium这样的Docker镜像,并且发现v3.4.0从旧的JSonWire规范返回ELEMENT密钥,而v3.9返回格式{{ 1}}来自新的WebDriver规范。 (我还没检查过其他版本)。

这是他们逐渐迁移到WebDriver的一部分,但有点令人困惑的是,他们在3.5(或其左右)而不是v3.0.0上做了这个突破性变化,我认为每个人都可以使用。< / p>

此外,&#34; native&#34;中还有各种实现方式。现在由Firefox团队制作的Gecko和Chrome驱动程序,因为他们将有不同的开发路线图。

此外,我发现客户端库我使用hasn甚至还没有实现新的响应,因此我不得不暂时停留一段时间(或补丁)并自己公关)。我在其他客户端看到了类似的对话(例如Java client 2 years ago)。

您可以看到两种协议之间的差异&#39;元素响应的定义:

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

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