使用POST /session/{session id}/element
执行搜索后,我从Chrome网络驱动程序中获取此信息:
{ sessionId: '3241e7da289f4feb19c1f55dfc87024b',
status: 0,
value: { ELEMENT: '0.12239552668870868-1' } }
这是the specs要求的吗?
我在问,因为我无法在任何地方找到一个清楚地说明的地方" ELEMENT"用大写字母。我在规范中找到的就是设置了一个名为value
的密钥(它是:它被设置为{ ELEMENT: '0.12239552668870868-1' }
我是否始终能够始终期待这种反应,来自其他浏览器' webdrivers?也就是说,status
和sessionId
总是会返回吗?
这是{ ELEMENT: '0.12239552668870868-1' }
铬构成物体的方式吗?或者这适用于任何网络驱动程序?不是,其他网络驱动程序会返回什么?
答案 0 :(得分:2)
正如您提到的WebDriver-W3C Candidate Recommendation
,让我们看一下相关的部分。规范明确提到以下内容:
[[GetOwnProperty]]
(名称)。[[GetOwnProperty]]
中的ECMAScript® Language Specification
定义为:String对象使用用于其他本机ECMAScript对象的[[GetOwnProperty]]内部方法的变体。这种特殊的内部方法提供了对与String对象的各个字符对应的命名属性的访问。
GetOwnProperty
是用于其他本机ECMAScript对象的内部方法,并在Browser Drivers
和Browser Clients
的内部范围内解析。Object.getOwnPropertyNames()
和getOwnPropertyDescriptors()
。我做了一个小测试,其中包含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 ,并且行为方面可能会有所不同。
根据您的问题和更新,您对 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
给最终用户。
从@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