Значения, возвращаемые веб-драйверами
После выполнения поиска с помощью POST /session/{session id}/element
Я получаю это от веб-драйвера Chrome:
{ sessionId: '3241e7da289f4feb19c1f55dfc87024b',
status: 0,
value: { ELEMENT: '0.12239552668870868-1' } }
Это то, что требуют спецификации?
Я спрашиваю, потому что я нигде не мог найти место, где написано прописными буквами "ЭЛЕМЕНТ". Все, что я могу найти в спецификации, это то, что ключ называется value
установлено (что это: это установлено как { ELEMENT: '0.12239552668870868-1' }
Могу ли я всегда ожидать такой ответ от веб-драйверов других браузеров? То есть
status
а такжеsessionId
всегда вернулся?В том, что
{ ELEMENT: '0.12239552668870868-1' }
как хром составляет объект? Или это верно для любых веб-драйверов? Что нет, что возвращают другие вебдрайверы?
2 ответа
Как вы упомянули WebDriver-W3C Candidate Recommendation
, давайте посмотрим соответствующие биты. В спецификациях четко упоминается следующее:
- Команда "Найти элемент" используется для поиска элемента в текущем контексте просмотра, который можно использовать для будущих команд.
- Пусть стратегия размещения будет результатом получения свойства под названием "использование".
- Пусть селектор будет результатом получения свойства под названием "значение".
- Результат получения свойства с именем аргумента определяется как результат вызова Object.
[[GetOwnProperty]]
(название). [[GetOwnProperty]]
вECMAScript® Language Specification
определяется как:
В строковых объектах используется вариация внутреннего метода [[GetOwnProperty]], используемого для других собственных объектов ECMAScript. Этот специальный внутренний метод обеспечивает доступ к именованным свойствам, соответствующим отдельным символам объектов String.
- Так ссылаясь
GetOwnProperty
являются внутренним методом, используемым для других собственных объектов ECMAScript, и разрешаются во внутренней области видимостиBrowser Drivers
а такжеBrowser Clients
, - Mozilla хорошо документирована
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
(оба совместимы с W3C), ChromeDriver
по-прежнему не соответствует требованиям W3C и может отличаться по поведенческим аспектам.
Обновление А
Согласно вашему вопросу и обновлению, вы правы относительно ChromeDriver
а также Chrome
протокол связи. Становясь более детальными, мы можем найти некоторую разницу в webdriver
позвоните следующим образом:
Fire Fox:
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 Browser возвращает:
"value": {"ELEMENT": "0.7086986861512812-1"}
Для нас больше всего важно значение элемента, возвращаемого объектом браузера, который всегда ссылается пользователем и правильно идентифицируется пользователем. webdriver
пример. Вся эта внутренняя логика становится abstract
до конечного пользователя.
Обновление Б
Добавление нескольких значимых байтов из @FlorentB. комментарии:
Более ранние версии
Selenium
т.е.Selenium v2.x
использовал ключевое словоELEMENT
хранить ссылку наDOM
элемент. Этот ключ был изменен в последних версияхSelenium
т.е.Selenium v3.x
вelement-6066-11e4-a52e-4f735466ce
, Большая часть реализации текущегоChromeDriver
все еще изSelenium 2.x
спекуляция
Я только что столкнулся с этой же проблемой, и обнаружил, что изменение было сделано около 3.5 сервера Selenium и связанных изображений.
Я нашел этот комментарий наиболее конкретным, чтобы понять изменение и определить, в какой версии оно изменилось: https://github.com/SeleniumHQ/selenium/issues/4773
Я использую образы Docker, такие как selenium/node-firefox:3.4.0-actinium, и обнаружил, что v3.4.0 возвращает ELEMENT
ключ из старой спецификации JSonWire, тогда как v3.9 возвращает формат element-6066-11e4-a52e-4f735466cecf
из новой спецификации WebDriver. (Я не проверял никаких других версий между ними).
Это часть их постепенного перехода на WebDriver, но немного сбивает с толку то, что они сделали это критическое изменение в версии 3.5 (или около того), а не в версии 3.0.0, с которой, я думаю, все были бы в порядке.
Также есть смесь реализаций в "родных" драйверах, таких как Gecko, которые сейчас выпускаются командой Firefox, и Chrome, так как у них будут разные планы развития.
Более того, я обнаружил, что библиотека на стороне клиента, которую я использую, еще даже не реализовала новый ответ, поэтому мне придется ненадолго задержаться (или пропатчить и сделать PR самому). Я видел подобные разговоры в других клиентах (например, Java-клиент 2 года назад).
Вы можете увидеть различия между определениями двух протоколов ответа элемента:
https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol