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

How Wait Page Load With Selenium



Si bien la automatización web o el web scraping con el controlador web Selenium, es posible que tenga 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 procesaba. 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 procesa 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 también los procese. 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 Selenium que espere varios segundos hasta que 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 satisfagan 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 Firefox Gecko Driver o Chrome Web Driver.

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 -pvselenio-espera/conductores

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

$cdselenio-espera/

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/soy/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 artículo.

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

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.

deselenioimportarwebdriver
deselenio.webdriver.común.teclas importarTeclas
opciones=webdriver.ChromeOptions()
opciones.sin cabeza = Cierto
navegador=webdriver.Cromo(ruta_ejecutable='./drivers/chromedriver',opciones=opciones)
navegador.implícitamente_esperar(10)
navegador.obtener('https://www.unixtimestamp.com/')
marca de tiempo=navegador.find_element_by_xpath('// h3 [@] [1]')
impresión('Marca de tiempo actual:% s'%(marca de tiempo.texto.separar(' ')[0]))
navegador.cerrar()

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 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 del navegador.

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

La línea 12 busca 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 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 la secuencia de comandos de Python ex01.py como sigue:

$ python3 ex01.py

Como puede ver, la marca de tiempo actual se extrae de unixtimestamp.com y se imprime 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.

deselenioimportarwebdriver
deselenio.webdriver.común.teclas importarTeclas
deselenio.webdriver.común.por importarPor
deselenio.webdriver.apoyo.cebolla importarWebDriverWait
deselenio.webdriver.apoyo importarcondiciones_esperadas
opciones=webdriver.ChromeOptions()
opciones.sin cabeza = Cierto
navegador=webdriver.Cromo(ruta_ejecutable='./drivers/chromedriver',opciones=opciones)
navegador.obtener('https://www.unixtimestamp.com/')
tratar:
marca de tiempo=WebDriverWait(navegador, 10).Hasta que(
condiciones_esperadas.presencia_de_elemento_ubicado((Por.XPATH, '
// h3 [@] [1] '
))
)
impresión('Marca de tiempo actual:% s'%(marca de tiempo.texto.separar(' ')[0]))
finalmente:
navegador.cerrar()

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 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 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_localizado () El método se utiliza para asegurarse de que el elemento esté presente antes de intentar seleccionarlo. 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 = ’text-danger’] [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á impresa en la consola.

Seleccionar 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 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.CLASS_NAME - Selecciona elemento / elementos usando el nombre de clase CSS.

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

By.ID - Selecciona el elemento por ID

By.NAME - Selecciona elemento / elementos por nombre.

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

Por.LINK_TEXT - 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 el 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 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 un ancho y un alto mayores que 0.

visibilidad_de_elemento_ubicado (localizador)

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

presencia_de_todos_elementos_ubicados () - Se asegura de que todos los elementos coincidan con el locador está presente en la página. los 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 . los 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. los locador es un (Por, selector) tupla.

element_to_be_selected (localizador) - Comprueba si el elemento situado junto al locador está seleccionado. los 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 el 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 les 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 selenio, visite la biblioteca oficial de Selenium Python espera la página de documentación .