Cómo funciona el selenio: episodios 1 - 2

Se preparó una traducción del artículo antes del inicio del curso de Java QA Engineer .



Episodio 1 - Transporte


Como resultado del diálogo que tuvo lugar el último fin de semana de enero de 2020, que se dedicó a uno de los problemas en Selenium, donde alguien me dijo "por qué simplemente no harás esto ..." en respuesta a explicar el problema, decidí escribir una serie de artículos explicando los comandos en Selenium WebDriver y por qué terminamos con el diseño que tenemos hoy.

Repetiré esto en cada episodio de esta serie: mucho, a veces hasta el punto de la locura, se pensó mucho en el trabajo de cada pequeño detalle de Selenium.

¿Por qué?

Por casualidad y qué tan bien hace lo que está destinado a hacer, Selenium es utilizado por millones de personas en todo el mundo. Así es como la gama más amplia de empresas, desde pequeñas empresas hasta Microsoft y Google, se asegura de que su sitio funcione en todos los navegadores.

Selenium ?


Con los años de Selenium, terminamos centrándonos en usar HTTP como una forma de interactuar con el navegador. Creamos la API REST-ish (REST-ish - en el espíritu de REST), que puede usar el enlace de cada cliente y obtener, esperamos, los mismos resultados.

HTTP y REST-ish? ¿Seriamente?

Sí ...

Comencemos con la parte HTTP. Cuando comenzamos, teníamos que admitir diferentes formas de interactuar con cada navegador, según el mejor enfoque para cada uno de ellos. Por ejemplo, para Internet Explorer, escribimos el código COM. Trabajó bien, pero de él todavía tenemos pesadillas. Para Firefox, escribimos un monstruo de lectura línea por línea, que, afortunadamente, gracias al enfoque de "crea tu navegador" de Mozilla, fue capaz de mucho. Opera nos permitió ingresar a través del protocolo DevTools.

Por lo tanto, esto significaba que, especialmente en los primeros años de WebDriver, necesitábamos admitir enlaces N: M, donde N son los enlaces de idioma y M son los navegadores que admitimos. Este camino no conduce a un buen producto. Decidimos que necesitábamos algo que todos los idiomas pudieran entender. También necesitábamos algo bastante confiable. Entonces la elección recayó en HTTP, y comenzamos a crear JSONWireProtocol.

En el marco, JSONWireProtocolcreamos una interfaz REST-ish que se comunica en JSON. Digo REST-ish porque no sigue absolutamente todos los principios de REST, sino que los incorpora en un grado suficiente para que sea una herramienta poderosa para nuestras tareas.

¿Qué pasa con el estado actual de las cosas?

La web, Internet y el mundo siguen adelante. Entonces, ¿por qué no selenio?

Esta es una buena pregunta, pero el hecho es que estamos tratando de modernizarnos. Desafortunadamente, la red se caracteriza por un estado en el que no funciona, si no se está ejecutando. HTTP es bastante confiable como protocolo. También permite a las personas crear grupos para realizar pruebas sin preocuparse de cómo funcionará la multiplexación. Esta es la razón por la que se creó Selenium Grid, que sigue siendo una buena opción cuando se trata de organizar pruebas con múltiples dispositivos y computadoras.

Pero se parece más a una red.

Entonces ... Hay herramientas que utilizan su Protocolo de depuración de Chrome para controlar Chrome. Hacen algunas cosas mejor que Selenium, que es una consecuencia de su elección de cómo comunicarse con el navegador. Desafortunadamente, este es el protocolo patentado de Chrome, y hacer que sea accesible para otros navegadores no interesa a Google.

Además, ignorando las interesantes soluciones de diseño del equipo de Google, existe un problema tal que debemos tener una conexión constantemente abierta. En este caso, usa WebSockets, pero debe recordar mi comentario anterior de que Internet no está disponible mientras no funciona. WebSockets se volverá a conectar constantemente. También existe el problema de cuánto tráfico subirá y bajará por este canal.

Esto no es un problema para el titiritero cuando interactúa con algo solo en su computadora local, pero si integra un servicio de CI como Circle CI o TravisCI y algo como AWS Device Farm, Sauce Labs o BrowserStack, entre usted y su corredor de repente obtiene Internet, y esta información debería llegar a los destinatarios.

El grupo de trabajo W3C Browser Testing and Tools, compuesto por proveedores de navegadores y Selenium, está tratando de diseñar cómo debería ser todo para asegurarse de que podamos garantizar la compatibilidad entre navegadores desde el principio, sin recurrir a parches de piratas informáticos extraños y entrega personal de estos navegadores

¿Quiere saber más?



Episodio 2 - Navegación
En este episodio veremos una gran cantidad de trabajo relacionado con la navegación.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")


Lo que vemos arriba ... parece bastante simple, cierto ... ¡pero aquí está!

De hecho, esto me lleva a una entrevista insensible. Si alguna vez alguien le pide que describa qué sucede en el navegador cuando escribe la URL y presiona enter, existe una alta probabilidad de que no tenga una idea real de lo que está sucediendo en la navegación. De todos modos ... volvamos a Selenium y su navegación. Tan pronto como enviamos la solicitud a través de la capa de transporte , comienza la verdadera diversión. Necesitamos averiguar a dónde queremos ir y decirle al navegador que vaya allí por nosotros. Desafortunadamente, esto conducirá al primero de muchos problemas para la automatización.

driver.get



Certificados


Si alguna vez trabajó en grandes empresas corporativas, donde la tecnología no es la principal, comprenderá qué tipo de dolor puede enfrentar el equipo de desarrollo. Ahora duplique este dolor, y puede imaginar el dolor que tienen que enfrentar los probadores y los ingenieros de automatización.

Uno de estos dolores son los certificados. Las empresas son tacañas y harán certificados autofirmados y otras deformidades. Especialmente en los primeros días de Selenium, cuando no había servicios como Let's Encrypt . E incluso ahora, la mayoría de los desarrolladores y grupos de control de calidad rara vez tienen acceso a cambios de configuración en sus entornos de prueba o en sus servidores CI. Necesitábamos encontrar una forma de evitar los certificados. ( Esta es una de las primeras razones por las cuales Selenium es visto como un riesgo de seguridad ) .

Por lo tanto, cada uno de los navegadores omite certificados mal configurados durante la automatización. Si no se hubieran dado cuenta de esto, muchos probadores / desarrolladores no tendrían la oportunidad de probar sus sitios.

Ahora ... cuando solucionamos el primer problema, necesitamos pasar a cargar la página.

Cargando


Tan pronto como recibimos los certificados, recibimos la página para descargar. Afortunadamente, no necesitamos hacer nada más complicado que el equivalente

location = "https://www.theautomatedtester.co.uk"; 
// 
window.location.href = "https://www.theautomatedtester.co.uk";


Hecho ...


Cuando Selenium "complete" el equipo, recibiremos un reembolso. Entonces, solo tenemos que esperar a que se cargue la página. Para ser completamente franco, ¿qué significa "carga finalizada" ?

El navegador activará varios eventos diferentes. Sabremos cuándo se mostrará la página y luego qué es readyState. Selenium probará todo esto y también esperará DOMContentLoaded.

Y luego surge un problema si está en una página e intenta saltar al ancla en esa página. Veamos el siguiente ejemplo.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
driver.get("https://www.theautomatedtester.co.uk#someAnchor")


Oh, solo mira, ¡ninguno de los eventos de carga de página se disparará! ¿Clase? Un navegador estúpido funcionará eficientemente y solo se desplazará al ancla. Esto significa que no podemos depender únicamente de los eventos que emanan de la página.

No, por lo tanto, necesitamos un código especial para este caso y una comprensión de lo que significa "listo" en este caso. Si cometemos un error, esto creará muchas pruebas inestables. Las pruebas inestables hacen que la gente se vuelva gruñona, y no queremos desarrolladores gruñones, hay suficientes en el mundo y sin pruebas inestables.

Después de completar estas comprobaciones, y puede manipular la forma en que vemos estos eventos, si desea que se carguen más rápido utilizando Estrategias de carga de página. Esta es más una característica del usuario de la pavimentadora, por lo que no me preocuparía por ellos ahora, pero afectan la velocidad de los comandos de navegación.

¿Qué pasa con los marcos de JavaScript y la navegación?


Este es el lugar donde se concentra toda la "diversión". Muchos marcos aún se cargarán mucho después de la carga inicial en la página. Si alguna vez trabajó en una aplicación de una sola página o simplemente la usó, ha visto aparecer muchos elementos a medida que se cargan. Desafortunadamente, esto significa que no puede confiar únicamente en el retorno del comando de navegación. Deberá agregar un comando WebDriverWaita su código, como se muestra a continuación, para asegurarse de que su prueba esté en el estado correcto antes de hacer lo que necesita.

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))


Conclusión


Al cargar una página, no siempre confíe en que Selenium regrese cuando la página haya terminado de cargarse. Si necesita mirar un elemento en una página, hágalo. Solo sepa cómo JavaScript en la página puede cambiarlo después de la carga inicial.

Para leer más






Aprende más sobre el curso .



All Articles