type page find_element selenium selenium-webdriver web-component polyfills remotewebdriver

page - selenium find element by value



Desde una perspectiva técnica, ¿cómo hace Selenium para hacer clic en un elemento en una página web? (2)

Se proporciona el contexto en caso de que alguien conozca una forma alternativa de resolver el problema más amplio.

Contexto del problema

Estoy encabezando el desarrollo de un marco de automatización de prueba para una aplicación web que utiliza componentes web. Esto ha presentado un problema al probar en Internet Explorer, porque Internet Explorer no admite componentes web de forma nativa; en su lugar, se utiliza un polyfill para proporcionar esta funcionalidad.

Una de las principales repercusiones de esto es que gran parte del selenio no funcionará como se esperaba. No puede "ver" el DOM Shadow en Internet Explorer de la misma forma que lo hace en Firefox y Chrome.

La alternativa es escribir un marco de prueba que proporcione un mecanismo alternativo para acceder a los elementos a través de JavaScript; esto permite que los elementos se localicen a través del polyfill.

Nuestra implementación actual comprueba el WebDriver está utilizando y usa la implementación original de Selenium de un método (en el caso de Chrome o Firefox), o nuestra implementación alternativa (en el caso de Internet Explorer).

Esto significa que queremos que nuestra implementación sea lo más cercana posible a la implementación de Selenium, en su núcleo, nivel de interacción con el navegador.

Problema

Estoy tratando de replicar la funcionalidad de Actions.click(WebElement onElement) ( source ), en una forma simplificada (sin seguir el patrón de diseño de Builder de la clase Actions , y haciendo suposiciones de que el clic es con el botón izquierdo del mouse y no con otro) Las teclas ( Ctrl , Shift , Alt ) se mantienen presionadas).

Quiero encontrar el código central que maneja el clic (específicamente en Chrome, Firefox e Internet Explorer), para poder replicarlo lo más cerca posible, sin embargo, me he encontrado perdido en un abismo de clases e interfaces. ..

Se ClickAction una nueva ClickAction ( source ) (para luego ser ejecutada). Realizar esto incluye una llamada ''click ()'' en una instancia de la interfaz del Mouse ( source ) ... aaaa y estoy perdido. Veo en JavaDoc generado que esto se implementa ya sea por EventFiringMouse ( source ) o por HtmlUnitMouse ( source ), pero no estoy seguro de cuál se implementará. Hice una suposición (con poca base) de que se usaría HtmlUnitMouse , lo que me ha llevado más lejos en el agujero del conejo al mirar el código HTMLUnit de Gargoyle Software ...

En definitiva, estoy totalmente perdido.

Cualquier orientación sería muy apreciada :)

Investigación

  • Descubrí que era incorrecto al suponer que Chrome, Firefox e Internet Explorer utilizan la unidad HTML. La documentación muestra que RemoteWebDriver ( source ) está subclasificado por ChromeDriver , FirefoxDriver e InternetExplorerDriver .

La wiki del Selenium IE Driver indica que utiliza eventos nativos en lugar de eventos de JavaScript para interactuar con el navegador.

Dado que InternetExplorerDriver es solo para Windows, intenta utilizar los llamados eventos "nativos" o de nivel del sistema operativo para realizar operaciones con el mouse y el teclado en el navegador. Esto contrasta con el uso de eventos simulados de JavaScript para las mismas operaciones.

Excepto por hacer clic en los elementos <option> , donde usa JavaScript.

El controlador de IE maneja este escenario mediante el click() Automation Atom, que esencialmente establece la propiedad .selected del elemento y simula el evento onChange en JavaScript.


Lo escencial

Los controladores para Chrome, Firefox e Internet Explorer son todos los RemoteWebDrivers .

Esto significa que cualquier acción que realice Selenium se envía al navegador (el WebDriver ), a través de un HttpRequest .

Una vez que el navegador recibe la solicitud, realizará la acción como un "evento nativo" o sintéticamente. La forma en que un navegador ejecuta una acción depende de las capacidades del navegador (y potencialmente de una opción de marca).

Los eventos "nativos" son eventos a nivel del sistema operativo.

Las acciones ejecutadas sintéticamente se ejecutan utilizando JavaScript. Se utilizan "átomos de automatización": como se infiere de ''átomo'', son funciones pequeñas y simples para realizar acciones de bajo nivel.

Referencias

  • RemoteWebDriver está subclasificado por ChromeDriver , FirefoxDriver , InternetExplorerDriver , OperaDriver y SafariDriver . ( reference )

  • Todas las implementaciones de WebDriver que se comunican con el navegador, o un servidor RemoteWebDriver deberán usar un protocolo de cable común. Este protocolo de conexión define un servicio web RESTful utilizando JSON sobre HTTP. ( reference )

  • En WebDriver, las interacciones de usuario avanzadas se proporcionan simulando los eventos de JavaScript directamente (es decir, eventos sintéticos) o permitiendo que el navegador genere los eventos de JavaScript (es decir, eventos nativos). Los eventos nativos simulan mejor las interacciones del usuario, mientras que los eventos sintéticos son independientes de la plataforma Los eventos [...] nativos deben usarse siempre que sea posible. ( reference )

  • Los átomos de automatización del navegador son bloques de construcción destinados a ser utilizados por las implementaciones de Selenium. Al usar las mismas piezas en todo el código base, en lugar de reimplementar la funcionalidad requerida en múltiples lugares, el proyecto puede reducir la cantidad de errores encontrados y puede simplificar el proceso de agregar nuevas funcionalidades y controladores. ( reference )

Átomos de automatización