NOTA: llamemos 'clic' es clic del usuario final. 'js click' es clic a través de JS
¿Por qué hacer clic en "a través de JavaScript" funciona cuando un clic en WebDriver normal no funciona?
Hay 2 casos para que esto suceda:
I. Si está usando PhamtomJS
Entonces este es el comportamiento conocido más común de PhantomJS
. Algunos elementos a veces no se pueden hacer clic, por ejemplo <div>
. Esto se debe a que PhantomJS
fue creado originalmente para simular el motor de los navegadores (como HTML + CSS inicial -> computación CSS -> renderizado). Pero no significa interactuar con el usuario final (ver, hacer clic, arrastrar). Por PhamtomJS
lo tanto, solo es parcialmente compatible con la interacción de los usuarios finales.
¿POR QUÉ JS HACE CLIC EN EL TRABAJO? En cuanto a cualquiera de los clics, todos son clics medios. Es como una pistola con 1 cañón y 2 disparadores . Uno de la ventana gráfica, uno de JS. Dado que es PhamtomJS
excelente para simular el motor del navegador, un clic JS debería funcionar perfectamente.
II El controlador de eventos de "clic" debe vincularse en el mal período de tiempo.
Por ejemplo, tenemos un <div>
-> Hacemos algunos cálculos
-> luego vinculamos el evento de clic al <div>
.
-> Además con alguna codificación incorrecta de angular (por ejemplo, no manejando el ciclo de alcance adecuadamente)
Podemos terminar con el mismo resultado. Hacer clic no funcionará porque WebdriverJS intenta hacer clic en el elemento cuando no tiene un controlador de eventos de clic.
¿POR QUÉ JS HACE CLIC EN EL TRABAJO? Js click es como inyectar js directamente en el navegador. Posible de 2 maneras,
El puño es a través de la consola de devtools (sí, WebdriverJS se comunica con la consola de devtools).
El segundo es inyectar una <script>
etiqueta directamente en HTML.
Para cada navegador, el comportamiento será diferente. Pero independientemente, estos métodos son más complicados que hacer clic en el botón. Click está usando lo que ya está allí (clic de los usuarios finales), js click pasa por la puerta trasera.
Y para js click parecerá ser una tarea asincrónica. Esto está relacionado con un tema un poco complejo de ' tarea asincrónica del navegador y programación de tareas de la CPU ' (léelo hace un tiempo no puedo encontrar el artículo nuevamente). Para abreviar, esto resultará principalmente ya que js click tendrá que esperar un ciclo de programación de tareas de la CPU y se ejecutará un poco más lento después del enlace del evento click.
(Podría conocer este caso cuando encontró que el elemento a veces se puede hacer clic, a veces no).
¿Cuándo exactamente está sucediendo esto y cuál es la desventaja de esta solución (si la hay)?
=> Como se mencionó anteriormente, ambos significan para un propósito, pero sobre el uso de qué entrada:
- Click: está utilizando lo que proporciona por defecto el navegador.
- JS click: está pasando por la puerta trasera.
=> Para el rendimiento, es difícil de decir porque se basa en los navegadores. Pero en general:
- Clic: no significa más rápido, pero solo firmó una posición más alta en la lista de programación de la tarea de ejecución de la CPU.
- Clic JS: no significa más lento, pero solo inició sesión en la última posición de la lista de tareas de CPU.
=> Desventajas:
- Clic: no parece tener ningún inconveniente, excepto que está utilizando PhamtomJS.
- JS click: muy malo para la salud. Puede hacer clic accidentalmente en algo que no aparece en la vista. Cuando use esto, asegúrese de que el elemento esté allí y disponible para ver y hacer clic como el punto de vista del usuario final.
PD: si estás buscando una solución.
- Usando PhantomJS? Sugeriré usar Chrome sin cabeza en su lugar. Sí, puedes configurar Chrome sin cabeza en Ubuntu. La cosa funciona igual que Chrome pero solo no tiene una vista y es menos defectuosa como PhantomJS.
- ¿No usa PhamtomJS pero aún tiene problemas? Sugeriré usar ExpectedCondition of Protractor con
browser.wait()
( verifique esto para obtener más información )
(Quiero hacerlo breve, pero terminó mal. Cualquier cosa relacionada con la teoría es complicada de explicar ...)