Подтвердить что ты не робот

С технической точки зрения, как Selenium нажимает элемент на веб-странице?

Контекст предоставляется в случае, если кто-либо знает об альтернативном способе решения более крупной проблемы.


Контекст проблем

Я возглавляю разработку основы автоматизации тестирования для веб-приложения, которое использует веб-компоненты. Это вызвало проблему при тестировании в Internet Explorer, поскольку Internet Explorer не поддерживает веб-компоненты изначально; вместо этого для обеспечения этой функциональности используется polyfill.

Первичным следствием этого является то, что большая часть Selenium не будет работать должным образом. Он не может "видеть" Shadow DOM в Internet Explorer так, как он может в Firefox и Chrome.

Альтернативой является создание тестовой структуры, которая предоставляет альтернативный механизм доступа к элементам через JavaScript - это позволяет элементам размещаться через polyfill.

Наша текущая реализация проверяет используемую WebDriver и либо использует оригинальную реализацию метода Selenium (в случае Chrome или Firefox), либо нашу собственную альтернативную реализацию (в случае Internet Explorer).

Это означает, что мы хотим, чтобы наша реализация была как можно ближе к реализации Selenium, по своей сути, к взаимодействию с браузером.


Проблема

Я пытаюсь реплицировать функциональность Actions.click(WebElement onElement) (source) в упрощенной форме (не следуя шаблону проектирования Builder класса Actions и предположения, что щелчок левой кнопкой мыши и никакие другие клавиши (Ctrl, Shift, Alt) удерживаются).

Я хочу найти основной код, который обрабатывает щелчок (в частности, в Chrome, Firefox и Internet Explorer), поэтому я могу скопировать его как можно ближе, однако я обнаружил, что потерял себя в глубокой яме классов и интерфейсы...

Создан новый ClickAction (источник) (для последующего выполнения). Выполнение этого включает вызов "click()" для экземпляра интерфейса Mouse (источник)... aaaaand Я потерян. Я вижу из сгенерированного JavaDoc, что это реализовано с помощью EventFiringMouse (источник) или HtmlUnitMouse (источник), но я не уверен, какой из них будет реализован. Я сделал предположение (с небольшим основанием), что HtmlUnitMouse будет использоваться, что привело меня дальше вниз по кроличьей дыре, глядя на код HTMLUnit от Gargoyle Software...

Короче говоря, я полностью потерян.

Любое руководство было бы высоко оценено:)


Исследование

  • Я обнаружил, что я ошибался в своем предположении, что HTMLUnit используется Chrome, Firefox и Internet Explorer. Документация показывает, что RemoteWebDriver (источник) подклассифицирован ChromeDriver, FirefoxDriver и InternetExplorerDriver.
4b9b3361

Ответ 1

Основные понятия

Драйверы для Chrome, Firefox и Internet Explorer все RemoteWebDrivers.

Это означает, что любые действия, которые выполняет Selenium, отправляются в браузер (WebDriver) через HttpRequest.

Как только запрос будет получен браузером, он выполнит действие как "родное событие" или синтетически. Как браузер выполняет действие, зависит от возможностей браузера (и, возможно, параметра флага).

"Родные" события - это события уровня ОС.

Действия, выполняемые синтетически, выполняются с использованием JavaScript. "Атомы автоматизации" используются - как один из "атома", это небольшие, простые функции для выполнения действий низкого уровня.


Ссылки

  • RemoteWebDriver подклассы ChromeDriver, FirefoxDriver, InternetExplorerDriver, OperaDriver и SafariDriver. (ссылка)

  • Все реализации WebDriver, которые взаимодействуют с браузером или сервером RemoteWebDriver, должны использовать общий проводной протокол. Этот проводной протокол определяет веб-сервис RESTful с помощью JSON через HTTP. (ссылка)

  • В WebDriver расширенные пользовательские взаимодействия обеспечиваются либо симуляцией событий JavaScript напрямую (т.е. синтетическими событиями), либо позволяя браузеру генерировать события JavaScript (т.е. собственные события). Родные события лучше имитируют взаимодействие с пользователем, тогда как синтетические события независимы от платформы [...] При необходимости можно использовать собственные события. (ссылка)

  • Автоматизация браузера Атомы - это блоки, предназначенные для использования в реализациях Selenium. Используя одни и те же фрагменты всей кодовой базы, а не переопределяя требуемые функции в нескольких местах, проект может уменьшить количество найденных ошибок и упростить процесс добавления новых функций и драйверов. (ссылка)


Атомы автоматизации

Ответ 2

wiki для Selenium IE Driver утверждает, что для взаимодействия с браузером он использует собственные события, а не события JavaScript.

Поскольку InternetExplorerDriver только для Windows, он пытается использовать так называемые "родные" или события уровня ОС для выполнения мыши и клавиатуры операций в браузере. Это в отличие от использования моделируемых События JavaScript для тех же операций.

За исключением щелчка <option> элементов, где он использует JavaScript.

Драйвер IE обрабатывает этот сценарий, используя click()Automation Atom, который по существу устанавливает свойство .selectedи имитирует событие onChange в JavaScript.