【问题标题】:Values returned by webdrivers网络驱动程序返回的值
【发布时间】:2018-06-30 08:37:23
【问题描述】:

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

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

这是the specs的要求吗?

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

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

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

【问题讨论】:

  • former Selenium 2 protocol 使用键 ELEMENT 来存储 DOM 元素的引用。此密钥已通过 Selenium 3 protocol 更改为 element-6066-11e4-a52e-4f735466ce。尽管当前 chromedriver 的大部分实现仍然来自 Selenium 2 规范。

标签: selenium webdriver chrome-web-driver


【解决方案1】:

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

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

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


浏览器特定实现

我用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 浏览器返回:

"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 添加一些重要字节。的 cmets :

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

【讨论】:

  • 我很困惑。我询问了浏览器中/session/{session id}/element webdriver 调用的格式.. ?
  • 为我的答案添加了更新。如果您有反驳问题,请告诉我。
  • 我有 one last question 关于这个...任何提示...?
【解决方案2】:

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

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

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

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

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

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

可以看到两种协议对 Element 响应的定义的区别:

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

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

【讨论】:

  • 是的,我已经解决了。这就是为什么我最终开发了best-webdriver ...看看!
  • 非常令人印象深刻,很高兴看到如此清晰的更改实现。
  • 我应该也可以编写一个集线器,只需不到 400 行代码。这意味着您可以在不接触 java/selenium 的情况下进行分布式测试...
  • 唯一真正的阻碍是 Chrome 不执行操作。这限制了 best-webdriver 的可行性——Selenium 的 API 做了很多模拟“动作”;我不想走那条路,特别是因为无论如何它们很快就会实施。 (另外,Selenium 的实现也有其局限性)
猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多