Selenio

Cómo esperar a que una página se cargue con selenio

Cómo esperar a que una página se cargue con selenio
Mientras que la automatización web o el web scraping con el controlador web Selenium, puede tener problemas como el elemento que desea seleccionar no está disponible o el botón que desea presionar no está listo para hacer clic, etc.

La razón por la que esto sucede es que el controlador web de Selenium debe descargar la página web y terminar de renderizar la página antes de que pueda hacer algo en ella. En el pasado, el servidor web generaba el contenido de un sitio web y el navegador simplemente lo descargaba y lo renderizaba. En estos días, tenemos muchas aplicaciones web de una sola página que funcionan de manera un poco diferente. En las aplicaciones web de una sola página (SPA), el servidor web solo sirve los códigos frontend. Una vez que el código de la interfaz se representa en el navegador, el código de la interfaz utiliza AJAX para solicitar datos de la API al servidor web. Una vez que la interfaz recibe los datos de la API, los procesa en el navegador. Por lo tanto, aunque el navegador ha terminado de descargar y renderizar la página web, la página web todavía no está lista. Debe esperar a que reciba los datos de la API y los procese 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, existen 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 esté lista).

2) Espera explícita: Esto es un poco complejo que la espera implícita. En espera explícita, le dice al controlador web Selenium qué esperar. El selenio espera 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á tanto como la espera implícita.

En este artículo, le mostraré cómo esperar (implícita y explícitamente) a que una página se cargue con Selenium. Entonces empecemos.

Requisitos previos:

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) Navegadores web Mozilla Firefox o Google Chrome instalados en su computadora.
6) Debe saber cómo instalar el controlador Firefox Gecko o el controlador web de Chrome.

Para cumplir con los requisitos 4, 5 y 6, lea mi artículo Introducción al selenio con Python 3 en Linuxhint.com.

Puede encontrar muchos artículos sobre otros temas en LinuxHint.com. Asegúrese de revisarlos si necesita ayuda.

Configuración de un directorio de proyectos:

Para mantener todo organizado, cree un nuevo directorio de proyectos selenio-espera / como sigue:

$ mkdir -pv selenium-wait / drivers

Navega al selenio-espera / directorio del proyecto de la siguiente manera:

$ cd selenium-wait /

Cree un entorno virtual de Python en el directorio del proyecto de la siguiente manera:

$ virtualenv .venv

Active el entorno virtual de la siguiente manera:

$ fuente .venv / bin / activar

Instale Selenium usando PIP3 de la siguiente manera:

$ pip3 instalar selenium

Descargue e instale todos los controladores web necesarios 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 en LinuxHint.com para ese articulo.

Usaré el navegador web Google Chrome para la demostración en este artículo. Entonces, usaré el conductor cromado binario del conductores / directorio.

Trabajar con espera implícita:

Para experimentar con la espera implícita, cree una nueva secuencia de comandos de Python ex01.py en el directorio de su proyecto y escriba las siguientes líneas de códigos en ese archivo.

desde el controlador web de importación de selenio
de selenio.webdriver.común.claves importar claves
opciones = webdriver.ChromeOptions ()
opciones.headless = Verdadero
browser = webdriver.Chrome (ruta_ejecutable = "./ drivers / chromedriver ", opciones = opciones)
navegador.espera_implícita (10)
navegador.get ("https: // www.unixtimestamp.com / ")
timestamp = navegador.find_element_by_xpath ("// h3 [@ class = 'texto-peligro'] [1]")
print ('Marca de tiempo actual:% s'% (marca de tiempo.texto.dividir (") [0]))
navegador.cerca()

Una vez que haya terminado, guarde el ex01.py Secuencia de comandos de Python.

Las líneas 1 y 2 importan todos los componentes de selenio necesarios.

La línea 4 crea un objeto de Opciones de Chrome.

Line 5 habilita el modo sin cabeza para el controlador web de Chrome.

La línea 7 crea un objeto del navegador Chrome usando el conductor cromado binario del conductores / directorio.

La línea 8 se usa para decirle a Selenium que espere implícitamente durante 10 segundos usando el implícitamente_esperar () método de navegador.

La línea 10 carga el www.unixtimestamp.com en el navegador.

La línea 12 busca el elemento de marca de tiempo utilizando el selector XPath // h3 [@ class = 'texto-peligro'] [1] y lo almacena en el marca de tiempo variable.

Obtuve el selector XPath de Chrome Developer Tool. Como puede ver, la marca de tiempo está en la primera h3 elemento con el nombre de la clase peligro de texto. Hay 2 h3 elementos con la clase peligro 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 script de Python ex01.py como sigue:

$ python3 ex01.py

Como puede ver, la marca de tiempo actual se extrae de unixtimestamp.com e impreso en la consola.

Trabajar con espera explícita:

Para experimentar con la espera explícita, cree una nueva secuencia de comandos de Python ex02.py en el directorio de su proyecto y escriba las siguientes líneas de códigos en ese archivo.

desde el controlador web de importación de selenio
de selenio.webdriver.común.claves importar claves
de selenio.webdriver.común.por importación Por
de selenio.webdriver.apoyo.ui importar WebDriverWait
de selenio.webdriver.Admite la importación de condiciones_esperadas
opciones = webdriver.ChromeOptions ()
opciones.headless = Verdadero
browser = webdriver.Chrome (ruta_ejecutable = "./ drivers / chromedriver ", opciones = opciones)
navegador.get ("https: // www.unixtimestamp.com / ")
intentar:
marca de tiempo = WebDriverWait (navegador, 10).Hasta que(
condiciones_esperadas.presencia_de_elemento_localizado ((Por.XPATH, "
// h3 [@ class = 'texto-peligro'] [1] "))
)
print ('Marca de tiempo actual:% s'% (marca de tiempo.texto.dividir (") [0]))
finalmente:
navegador.cerca()

Una vez que haya terminado, guarde el ex02.py Secuencia de comandos de Python.

La línea 1-5 importa todos los componentes necesarios de la biblioteca de Selenium.

La línea 7 crea un objeto de Opciones de Chrome.

Line 8 habilita el modo sin cabeza para el controlador web de Chrome.

La línea 10 crea un objeto del navegador Chrome usando el conductor cromado binario del conductores / directorio.

La línea 12 carga el www.unixtimestamp.com en el navegador.

La espera explícita se implementa en el bloque de intentar finalmente (de la línea 14-20)

La línea 15-17 utiliza crea WebDriverWait () objeto. El primer argumento de WebDriverWait () es el objeto del navegador y el segundo argumento es el tiempo máximo permitido (en el peor de los casos) para cumplir la condición, que en este caso es de 10 segundos.

En el Hasta que() cuadra, condiciones_esperadas.presencia_de_elemento_ubicado () 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_de_elemento_ubicado () método que hemos utilizado un selector XPath para seleccionar el elemento. El selector XPath es // h3 [@ class = 'texto-peligro'] [1].

Una vez que se encuentra el elemento, se almacena en el marca de tiempo variable.

La línea 18 imprime 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 Secuencia de comandos de Python de la siguiente manera:

$ python3 ex02.py

Como puede ver, la marca de tiempo actual de unixtimestamp.com está impreso en la consola.

Seleccionar elementos en esperas explícitas:

En la sección anterior, he usado Por.XPATH para seleccionar el elemento con el selector XPath. También puede seleccionar los elementos usando ID, nombre de etiqueta, nombre de clase CSS, selector de CSS, etc.

Los métodos de selección admitidos se indican a continuación:

Por.XPATH - Selecciona elemento / elementos usando el selector XPath.

Por.NOMBRE DE LA CLASE - Selecciona elemento / elementos usando el nombre de la clase CSS.

Por.CSS_SELECTOR - Selecciona elemento / elementos usando el selector CSS.

Por.IDENTIFICACIÓN - Selecciona el elemento por ID

Por.NOMBRE - Selecciona elemento / elementos por nombre.

Por.TAG_NAME - Selecciona elemento / elementos por nombre de etiqueta HTML.

Por.TEXTO DEL ENLACE - Selecciona elemento / elementos por texto de enlace de a (ancla) etiqueta HTML.

Por.PARTIAL_LINK_TEXT - Selecciona elemento / 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ícito anterior, he usado el presencia_de_elemento_ubicado () método de condiciones_esperadas como condición de espera explícita para asegurarme de que el elemento que estaba buscando existe antes de seleccionarlo.

Hay otros condiciones_esperadas se puede utilizar como condición de espera explícita. Algunos de ellos son:

title_is (título) - comprueba si el título de la página es título.

title_contains (título_parcial) - comprueba si el título de la página contiene una parte del título título_parcial.

visibilidad_de (elemento) - comprueba si el elemento es visible en la página en la que el elemento tiene una anchura y una altura superiores a 0.

visibilidad_de_elemento_localizado (localizador) -

presencia_de_elemento_ubicado (localizador) - Asegúrese de que el elemento ubicado (junto al locador) está presente en la página. La locador es una tupla de (Por, selector), como he mostrado en el ejemplo de espera explícito.

presencia_de_todos_elementos_ubicados () - Se asegura de que todos los elementos coincidentes con el locador está presente en la página. La locador es un (Por, selector) tupla.

text_to_be_present_in_element (localizador, texto) - Comprueba si el texto está presente en el elemento ubicado por el locador. La locador es un (Por, selector) tupla.

element_to_be_clickable (localizador) - Comprueba si el elemento situado junto al locador es visible y se puede hacer clic. La locador es un (Por, selector) tupla.

element_to_be_selected (localizador) - Comprueba si el elemento situado junto al locador está seleccionado. La locador es un (Por, selector) tupla.

alert_is_present () - Espere que haya un cuadro de diálogo de alerta en la página.

Hay muchos más condiciones_esperadas disponible para su uso. 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 utilizar la espera explícita en sus proyectos de Selenium, ya que Selenium intentará reducir el tiempo de espera tanto como sea posible. De esta manera, no tendrá que esperar una cantidad específica de segundos cada vez que ejecute sus proyectos de Selenium. La espera explícita debería ahorrar muchos segundos.

Para obtener más información sobre las esperas de Selenium, visite la página de documentación oficial de espera de la biblioteca de Selenium Python.

Cómo impulsar FPS en Linux?
FPS significa Cuadros por segundo. La tarea de FPS es medir la velocidad de fotogramas en reproducciones de video o actuaciones de juegos. En palabras...
Los mejores juegos de Oculus App Lab
Si es propietario de un visor Oculus, debe estar informado sobre la descarga lateral. Sideloading es el proceso de instalación de contenido que no es ...
Los 10 mejores juegos para jugar en Ubuntu
La plataforma Windows ha sido una de las plataformas dominantes para juegos debido al gran porcentaje de juegos que se están desarrollando hoy para ad...