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

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


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

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

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

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

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

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


Проблема

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

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

Новый ClickAction (исходный код) создается (для последующего выполнения). Выполнение этого включает вызов click() для экземпляра интерфейса Mouse (источник) ... ааааа, я запутался. Из сгенерированного JavaDoc я вижу, что это реализовано либо EventFiringMouse (< href="https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/events/internal/EventFiringMouse.java">источник) или HtmlUnitMouse (source), но я не уверен, какой из них быть реализованы. Я сделал предположение (с небольшим основанием), что будет использоваться HtmlUnitMouse, что привело меня еще дальше в кроличью нору, глядя на Код HTMLUnit от Gargoyle Software...

Короче, я совсем запутался.

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


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

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

person Eilidh    schedule 30.10.2015    source источник
comment
Реализация WebDriver решает, какой из них: ChromeDriver, FirefoxDriver, InternetExplorerDriver, HtmlUnitDriver, другие... Каждый ведет себя по-разному, в зависимости от базового браузера. Итак, первый шаг — выбрать один из них и копнуть глубже.   -  person Ahmed Ashour    schedule 30.10.2015
comment
Рассматривали ли вы возможность связаться с разработчиками Selenium и, возможно, поработать с ними над улучшением самого Selenium?   -  person SiKing    schedule 30.10.2015
comment
@SiKing Мы рассмотрели это (для большей проблемы). Это (то есть проблема Polyfills) было поднято как проблема на Selenium GitHub несколько недель назад и подтверждено другим автором, однако в последнее время не было никакой активности. У нас ограниченное время и ресурсы, и, учитывая обстоятельства, написание обходного решения было для нас лучшим вариантом.   -  person Eilidh    schedule 02.11.2015
comment
@AhmedAshour Я довольно подробно изучил как EventFiringMouse, так и HtmlUnitMouse, однако мне не удалось добиться большого прогресса ни в одном из них.   -  person Eilidh    schedule 02.11.2015
comment
Можете ли вы обновить свой вопрос полным случаем с кодом (Java и HTML), используя HtmlUnitDriver или HtmlUnit?   -  person Ahmed Ashour    schedule 02.11.2015
comment
Как обсуждалось выше, я ищу общий случай того, как выполняется сам щелчок в Actions.click(WebElement element). Я не рассматриваю конкретный случай. Я смотрю, как это делается в Chrome, Firefox и Internet Explorer (не уверен, что ошибся в своем предположении, что они используют HtmlUnit...)   -  person Eilidh    schedule 02.11.2015
comment
@AhmedAshour Я обновил вопрос выше, чтобы включить веб-браузеры «большой тройки» (Chrome, Firefox и Internet Explorer) в качестве конкретных направлений.   -  person Eilidh    schedule 02.11.2015
comment
Драйверы Chrome, FF и IE имеют RemoteDriver, что означает, что фактический код находится на стороне сервера вашего вызова. Никто не использует HtmlUnit, который является симулятором браузера, и не использует RemoteDriver. Я предлагаю вам использовать браузер, который обрабатывает веб-компоненты, и если он неправильно обрабатывает click, сообщите об ошибке соответствующей команде.   -  person Ahmed Ashour    schedule 02.11.2015
comment
@AhmedAshour Нам необходимо протестировать каждый из этих трех веб-браузеров. Как подробно описано выше, мы подняли проблему с Selenium, однако у нас нет ресурсов, чтобы ждать неизвестное время, пока это будет исправлено внешней командой. Я ценю пояснение, что они используют RemoteDriver, но просто сообщать об ошибке кому-то другому и прекращать работу над проблемой — это не полезное решение для нас.   -  person Eilidh    schedule 02.11.2015
comment
Вскоре он использует close-library.googlecode.com/git-history/docs / , github.com/SeleniumHQ/selenium/ блоб/ . Библиотека закрытия Google — это ключевая библиотека уровня атома, на которой построено 90% функциональности.   -  person Stan E    schedule 05.11.2015
comment
@Stanjer Это верно для всех трех браузеров?   -  person Eilidh    schedule 05.11.2015
comment
@Eilidh извините, дал вам неправильную ссылку, вот правильная github.com/SeleniumHQ/selenium/blob/ Вкратце, библиотека Closure — это каждый нижний уровень всей архитектуры, который обеспечивает большинство атомарных операций, от получения атрибутов до синтеза щелчков элементов. . Эта реализация и некоторая дополнительная логика, называемая атомами в Selenium (это видно по пути). Да, для всех браузеров. Другой вопрос, как бы вы внедрили это в каждый браузер (и у каждого свой путь).   -  person Stan E    schedule 05.11.2015
comment
@Eilidh ChromeDriver поддерживает ShadowDOM с версии 2.14. Кроме того, вместо того, чтобы писать свой собственный, я бы предложил начать с такого фреймворка, как Selenide. Владелец проекта Selenide, вероятно, мог бы рассказать вам, пробовал ли он когда-нибудь действия Shadow dom. Кроме того, имейте в виду, что у Selenium есть собственные действия, а также неродные действия Javascript; важно понимать разницу при сканировании кода.   -  person djangofan    schedule 05.11.2015
comment
@Eilidh: Вы хотите понять, как работает WebElement.click?   -  person Ant's    schedule 19.11.2015


Ответы (2)


Основные сведения

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

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

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

«Собственные» события — это события уровня ОС.

Действия, выполняемые синтетически, выполняются с использованием JavaScript. Используются «атомы автоматизации» — как следует из «атома», это небольшие простые функции для выполнения низкоуровневых действий.


Ссылки

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

  • #P9#
  • #P10#
  • #P11#

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

person Eilidh    schedule 01.12.2015
comment
Вот обновленная ссылка на код клика: github.com /SeleniumHQ/selenium/blob/master/javascript/атомы/ - person carlin.scott; 22.01.2019

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

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

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

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

person Andy Lamb    schedule 24.11.2015