English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
El método de prueba del WebDriver de Selenium que hemos presentado anteriormente se realiza basado en la página web. Los ejemplos anteriores utilizan páginas web simples para operar, lo que puede hacer que no se sienta el proceso de carga de la página web, pero en el proceso de aplicación real, la carga de la página web consume un tiempo determinado. Su script ya ha comenzado a ejecutarse, pero los elementos que desea ubicar aún no se han cargado, en este momento se producirá un error de que no se puede encontrar el elemento. Obviamente, un script que no considera el tiempo de carga no es un script exitoso. Hoy vamos a explicar cómo configurar el tiempo de espera.
Tres métodos de espera
time.sleep(n)
Esperar n segundos forzadamente. Es una función de Python en sí, que se incluye en el paquete time, se debe importar el paquete time antes de usarlo. A menudo se utiliza en nuestros ejemplos anteriores, para que todos puedan ver los resultados de ejecución del script. Este método de espera es muy torpe, sin importar cómo se cargue la página, debe esperar n segundos, que es bastante poco inteligente.
implicitly_wait(n)
Esperar el máximo de n segundos, si la página se carga completamente dentro de los n segundos, se finalizará el tiempo de espera anticipadamente. Es un método de espera proporcionado por WebDriver, también conocido como espera oculta, un poco más inteligente que el tiempo de espera forzoso, pero si la página本身就包含一个超大的视频等文件,即使我们需要定位的元素在最开始已经加载出来,却依旧要等待所有文件加载结束之后,脚本才能继续执行,依旧算是有一些弊端。
WebDriverWait(n)
Esperar el máximo de n segundos, cada ciertos momentos durante los n segundos se verificará si el elemento que se necesita localizar existe, si existe, se finalizará el tiempo de espera anticipadamente. Es un método de espera proporcionado por WebDriver, también conocido como espera explícita, que es un poco más inteligente que la espera oculta, ignorando la carga completa de la página, tan pronto como el elemento necesario exista, se finalizará el tiempo de espera.
Ejemplo
El tiempo de espera forzoso se ha utilizado en varios ejemplos anteriores, vamos a ver los dos métodos de espera proporcionados por WebDriver
Tiempo de espera oculto
En realidad, el tiempo de espera oculto también se ha utilizado en las presentaciones anteriores, pero no se mencionó específicamente el método de uso. Esta vez abriremos la página principal de NetEase, que es un portal de noticias con mucho contenido, según la velocidad de la conexión a internet, se estima que10segundos aproximadamente para que se cargue completamente, configuramos el tiempo de espera60 segundos, luego calculemos cuánto tiempo lleva desde que abrimos la página hasta que hacemos clic en el botón de navegación [Cursos Públicos] en la página.
# coding = utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(60) #Tiempo de espera oculto60 segundos time_start = time.time() #Registrar el tiempo al abrir la página driver.get('https://www.163.com/) driver.find_element_by_id('js_love_url').click() time_end = time.time() #Registrar el tiempo después de hacer clic en el botón print('el tiempo de acceso es: ', time_end - time_start) #Imprimir la diferencia de tiempo, es decir, el tiempo real consumido time.sleep(2) #Esperar forzadamente2segundos, para observar realmente hemos abierto la página [Cursos Públicos] driver.quit()
Al ver el final de la ejecución del script, aunque hemos configurado un tiempo oculto de60 segundos, pero5Aproximadamente un segundo (vea los resultados de ejecución a continuación) la página se ha cargado completamente, puede hacer clic en el botón [Cursos Públicos]. A continuación, se muestra mi resultado de ejecución, que muestra el tiempo total de carga.
>>>tiempo de acceso es : 5.717327117919922
Tiempo de espera explícito
Al usar el tiempo de espera explícito, es necesario importar la clase selenium.webdriver.support.wait.WebDriverWait, las API son las siguientes:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
Debido a que el tiempo de espera explícito puede necesitar confirmar la existencia del elemento, generalmente se debe usar junto con los siguientes dos métodos
until(method, message='') until_not(method, message='')
Atención, method() debe ser un método invocable, debe tener el método __call__(). Vamos a volver a escribir el ejemplo.
# coding = utf-8 from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait import time driver = webdriver.Chrome() class button(): def __call__(self, driver): if driver.find_element_by_id('js_love_url'): return True else: return False driver.implicitly_wait(60) time_start = time.time() driver.get('https://www.163.com/) # driver.find_element_by_id('js_love_url').click() WebDriverWait(driver,2,0.5).until(button()) time_end = time.time() print('el tiempo de acceso es: ', time_end - time_start) time.sleep(2) driver.quit()
Después de ver este ejemplo, puede haber dudas, porque he configurado explícitamente la espera2segundos, ¿por qué no se produjo un error? Porque también hemos configurado el tiempo de espera oculto, se toma el tiempo de espera más largo de ambos como el tiempo de espera real, por lo que en este ejemplo, el tiempo de espera sigue siendo60 segundos.
Resumen
1、Selenium puede adoptar tres formas de espera, la más inteligente es WebDriverWait()
2、Cuando existen tanto la espera oculta como la espera explícita, se toma el tiempo de espera más largo de ambos como el tiempo de espera efectivo
3、En la espera explícita, el method() de until(method()) es un método llamativo, se puede definir por sí mismo, también se puede usar métodos como funciones anónimas, etc., esto lo discutiremos en detalle más adelante
4、Configuración de espera oculta una vez, es decir, a lo largo de todo el script, la espera forzada debe establecerse en cada lugar que necesite esperar
Esto es todo el contenido de este artículo, espero que ayude a su aprendizaje y que todos apoyen el tutorial de gritos.
Declaración: El contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @ para denunciar y proporcione evidencia. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.)