Значения, возвращаемые веб-драйверами

После выполнения поиска с помощью 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

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

Другие вопросы по тегам