Webdrivers 返回的值

Values returned by webdrivers

提问人:Merc 提问时间:1/22/2018 更新时间:2/13/2020 访问量:944

问:

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

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

这是规格要求的吗?

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

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

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

Selenium Web驱动程序 chrome-web-driver

评论

1赞 Florent B. 1/23/2018
以前的 Selenium 2 协议使用密钥来存储 DOM 元素的引用。此密钥已随 Selenium 3 协议更改为 。尽管目前的大部分实现仍然来自 Selenium 2 规范。ELEMENTelement-6066-11e4-a52e-4f735466cechromedriver

答:

2赞 undetected Selenium 1/22/2018 #1

WebDriver-W3C 候选建议明确提到了以下几点:

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

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


特定于浏览器的实现

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

  • Chrome驱动程序 - 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"}

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


更新 B

从@FlorentB添加一些有效字节。的评论:

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

评论

0赞 Merc 1/22/2018
我很困惑。我询问了浏览器中 webdriver 调用的格式。?/session/{session id}/element
0赞 undetected Selenium 1/22/2018
为我的答案添加了更新。如果您有反问题,请告诉我。
0赞 Merc 1/23/2018
我还有最后一个问题......有什么提示吗...?
0赞 scipilot 2/17/2018 #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 规范返回密钥,而 v3.9 从新的 WebDriver 规范返回格式。ELEMENTelement-6066-11e4-a52e-4f735466cecf

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

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

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

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

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

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

评论

0赞 Merc 2/17/2018
是的,我把一切都解决了。这就是为什么我最终开发了最好的网络驱动程序......看一看!
0赞 scipilot 2/18/2018
非常令人印象深刻,很高兴看到如此清晰的更改实现。
0赞 Merc 2/18/2018
我也应该能够在不到 400 行代码中编写一个集线器。这意味着您可以在不接触 java/selenium 的情况下进行分布式测试......
0赞 Merc 2/18/2018
唯一真正的障碍是 Chrome 没有实施操作。这限制了 best-webdriver 的可行性——Selenium 的 API 在模拟“动作”方面做了很多工作;我不想走这条路,特别是因为它们无论如何都会很快实施。(另外,Selenium的实现有其局限性)