La razón por la que esto sucede es que el controlador web de Selenium debe descargar la página web y finalizar la página antes de que pueda hacer algo en ella. En el pasado, el servidor web generó el contenido de un sitio web, y el navegador lo descargó y lo hizo. En estos días tenemos muchas aplicaciones web de una sola página que funcionan un poco diferente. En las aplicaciones web de una sola página (SPA), el servidor web sirve solo los códigos de frontend. Una vez que el código frontend se representa en el navegador, el código frontend usa AJAX para solicitar datos de API al servidor web. Una vez que el frontend recibe los datos de la API, los convierte en el navegador. Entonces, a pesar de que el navegador ha terminado de descargar y representar la página web, la página web aún no está lista. Debe esperar a que reciba los datos de la API y los renderice también. Entonces, la solución a este problema es esperar a que los datos estén disponibles antes de hacer algo con Selenium.
En Selenium, hay 2 tipos de esperas:
1) espera implícita
2) espera explícita
1) espera implícita: Este es el más fácil de implementar. Una espera implícita le dice al controlador web de Selenium que espere varios segundos para que el DOM (modelo de objeto de documento) esté listo (la página web que esté lista).
2) espera explícita: Esto es un poco complejo que la espera implícita. En la espera explícita, le dice al controlador web de Selenium qué esperar. Selenium espera a que se cumpla esa condición específica. Una vez que se cumpla, el controlador web de Selenium estará listo para tomar otros comandos. Por lo general, el tiempo de espera explícito es variable. Depende de la rapidez con que se cumplan las condiciones. En el peor de los casos, la espera explícita esperará siempre que la espera implícita.
En este artículo, le mostraré cómo esperar (implícito y explícito) para que una página se cargue con Selenium. Entonces empecemos.
Prerrequisitos:
Para probar los comandos y ejemplos de este artículo, debe tener,
1) Una distribución de Linux (preferiblemente Ubuntu) instalada en su computadora.
2) Python 3 instalado en su computadora.
3) PIP 3 instalado en su computadora.
4) Python virtualenv Paquete instalado en su computadora.
5) Mozilla Firefox o Google Chrome Browsers instalados en su computadora.
6) Debe saber cómo instalar el controlador Gecko Firefox o el controlador web Chrome.
Para cumplir con los requisitos 4, 5 y 6, lea mi artículo Introducción al selenio con Python 3 en Linuxhint.comunicarse.
Puede encontrar muchos artículos sobre los otros temas en Linuxhint.comunicarse. Asegúrese de consultarlos si necesita alguna ayuda.
Configuración de un directorio de proyecto:
Para mantener todo organizado, cree un nuevo directorio de proyectos Selenium-wait/ como sigue:
$ mkdir -pv selenium -wait/conductores
Navegar al Selenium-wait/ Directorio de proyectos de la siguiente manera:
$ CD Selenium-Wait/
Cree un entorno virtual de Python en el directorio del proyecto de la siguiente manera:
$ virtualenv .venado
Active el entorno virtual de la siguiente manera:
$ fuente .venv/bin/activar
Instale selenio usando PIP3 de la siguiente manera:
$ PIP3 Instalar selenioDescargue e instale todo el controlador web requerido en el conductores/ directorio del proyecto. He explicado el proceso de descarga e instalación de controladores web en mi artículo Introducción al selenio con Python 3. Si necesita ayuda, busque Linuxhint.comunicarse para ese artículo.
Usaré el navegador web Google Chrome para la demostración en este artículo. Entonces, usaré el cromedríguico binario del conductores/ directorio.
Para experimentar con una espera implícita, cree un nuevo script de Python ex01.py en su directorio de proyecto y escriba las siguientes líneas de códigos en ese archivo.
Desde Selenium Import WebDriverUna vez que haya terminado, guarde el ex01.py Guión de pitón.
Línea 1 y 2 Importa todos los componentes de selenio requeridos.
La línea 4 crea un objeto de opciones de Chrome.
La línea 5 habilita el modo sin cabeza para el controlador web Chrome.
La línea 7 crea un objeto de navegador Chrome usando el cromedríguico binario del conductores/ directorio.
La línea 8 se usa para decirle a Selenium que espere implícitamente durante 10 segundos utilizando el implícitamente_wait () Método del navegador.
La línea 10 carga el www.uniptimestamp.com en el navegador.
La línea 12 encuentra el elemento de marca de tiempo utilizando el selector XPath // h3 [@class = 'Text-Danger'] [1] y lo almacena en el marca de tiempo variable.
Obtuve el selector XPath de la herramienta de desarrollador de Chrome. Como puede ver, la marca de tiempo está en la primera H3 elemento con el nombre de la clase amenazador de texto. Hay 2 H3 elementos con la clase amenazador de texto.
La línea 13 imprime solo la marca de tiempo del elemento que he seleccionado usando el selector XPath y almacenado en el marca de tiempo variable.
La línea 14 cierra el navegador.
Una vez que haya terminado, ejecute el guión de Python ex01.py como sigue:
$ python3 ex01.pyComo puede ver, la marca de tiempo actual se extrae de uniptimestamp.com e impreso en la consola.
Trabajando con una espera explícita:
Para experimentar con una espera explícita, cree un nuevo script de Python ex02.py en su directorio de proyecto y escriba las siguientes líneas de códigos en ese archivo.
Desde Selenium Import WebDriverUna vez que haya terminado, guarde el ex02.py Guión de pitón.
Línea 1-5 Importa todos los componentes requeridos de la biblioteca de Selenium.
La línea 7 crea un objeto de opciones de Chrome.
La línea 8 habilita el modo sin cabeza para el controlador web Chrome.
La línea 10 crea un objeto de navegador Chrome usando el cromedríguico binario del conductores/ directorio.
La línea 12 carga el www.uniptimestamp.com en el navegador.
La espera explícita se implementa en el bloque de try-finalmente (desde la línea 14-20)
Línea 15-17 usa creaciones Webdriverwait () objeto. El primer argumento de Webdriverwait () es el objeto del navegador, y el segundo argumento es el tiempo máximo permitido (peor de los casos) para cumplir con la condición, que es 10 segundos en este caso.
En el hasta() bloquear, esperado_conditions.presencia_of_element_located () El método se utiliza para asegurarse de que el elemento esté presente antes de intentar seleccionar el elemento. Aquí, Por.Xpath se usa para decirle al presencia_of_element_located () Método que hemos utilizado un selector XPath para seleccionar el elemento. El selector XPath es // h3 [@class = 'Text-Danger'] [1].
Una vez que se encuentra el elemento, se almacena en el marca de tiempo variable.
Línea 18 Impresa solo la marca de tiempo del elemento seleccionado.
Finalmente, la línea 19-20 cierra el navegador.
Una vez que haya terminado, ejecute el ex02.py Python script de la siguiente manera:
$ python3 ex02.pyComo puede ver, la marca de tiempo actual de uniptimestamp.com se imprime en la consola.
Selección de elementos en esperas explícitas:
En la sección anterior, he usado Por.Xpath para seleccionar el elemento usando el selector XPath. También puede seleccionar los elementos usando ID, nombre de la etiqueta, nombre de clase CSS, selector de CSS, etc.
Los métodos de selección admitidos se dan a continuación:
Por.Xpath - Selecciona elementos/elementos usando el selector XPath.
Por.NOMBRE DE LA CLASE - Selecciona elementos/elementos usando el nombre de la clase CSS.
Por.Css_selector - Selecciona elementos/elementos utilizando el selector CSS.
Por.IDENTIFICACIÓN - Selecciona elemento por ID
Por.NOMBRE - Selecciona elementos/elementos por nombre.
Por.Tag_name - Selecciona elementos/elementos por nombre de la etiqueta HTML.
Por.TEXTO DEL ENLACE - Selecciona elementos/elementos por texto de enlace de a (ancla) etiqueta html.
Por.Parcial_link_text - Selecciona elementos/elementos por texto de enlace parcial de a (ancla) etiqueta html.
Para obtener más información sobre estos, visite la página de documentación de la API de Python Selenium.
Condiciones esperadas en esperas explícitas:
En el ejemplo de espera explícita anterior, he usado el presencia_of_element_located () método de esperado_conditions Como la condición de espera explícita para asegurarse de que el elemento que estaba buscando existe antes de seleccionarlo.
Hay otros esperado_conditions Puede usar como una condición de espera explícita. Algunos de ellos son:
Title_is (título) - comprobaciones si el título de la página es título.
title_contains (parcial_title) - comprobaciones si el título de la página contiene una parte del título parcial_title.
visibilidad_of (elemento) - verifica si el elemento es visible en la página que es el elemento tiene ancho y una altura mayor que 0.
visibilidad_of_element_located (localizador) -
presencia_of_element_located (localizador) - Asegúrese de que el elemento ubicado (por el locador) está presente en la página. El locador es una tupla de (Por, selector), Como he demostrado en el ejemplo de espera explícita.
presencia_of_all_element_located () - Se asegura de que todo el elemento coincida con el locador está presente en la página. El locador es un (Por, selector) tupla.
text_to_be_present_in_element (localizador, texto) - Verifica si el texto está presente en el elemento ubicado por el locador. El locador es un (Por, selector) tupla.
element_to_be_clickable (localizador) - Comprobaciones si el elemento ubicado por el locador es visible y en clic en. El locador es un (Por, selector) tupla.
element_to_be_selected (localizador) - Comprobaciones si el elemento ubicado por el locador se selecciona. El locador es un (Por, selector) tupla.
alert_is_present () - Espere que esté presente un diálogo de alerta en la página.
Hay muchos más esperado_conditions Disponible para que los use. Para obtener más información sobre estos, visite la página de documentación de la API de Python Selenium.
Conclusión:
En este artículo, he discutido las esperas implícitas y explícitas de Selenium. También te he mostrado cómo trabajar con una espera implícita y explícita. Siempre debe intentar usar una espera explícita en sus proyectos de selenio, ya que Selenium intentará reducir el tiempo de espera tanto como sea posible. De esta manera, no tendrá que esperar un número específico de segundos cada vez que ejecute sus proyectos de selenio. La espera explícita debe ahorrar muchos segundos.
Para obtener más información sobre Selenium Waits, visite la página oficial de documentación de Waits de la Biblioteca Python Python Python.