English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Mucha gente pregunta en el grupo, ¿por qué no puedo localizar este cuadro desplegable, o ese cuadro emergente... varios problemas de localización. En realidad, en la mayoría de los casos, hay solo dos problemas:1 con frame,2 No se ha agregado espera. No sabe que la velocidad de ejecución de su código es de qué orden de magnitud, y la velocidad de carga y renderizado del navegador es de qué orden de magnitud. Es como si Flash y Ultraman se hubieran quedado de acuerdo para luchar contra un monstruo, y después de que Flash ha luchado y regresado, le pregunta a Ultraman por qué aún no ha salido de casa, mientras que estaba usando zapatos. Ultraman, enfadado, piensa en miles de caballos alado en su corazón, que Flash lo está aprovechando por su lentitud, por lo que se niega a jugar y lanza una excepción.
Entonces, ¿cómo podemos cuidar la lentitud de la carga de Ultraman? Solo una manera, esperar. Hablando de esperar, hay tres maneras de esperar, y el bloguero las explicará una por una:
1. Espera forzada
La primera y más sencilla manera es la espera forzada sleep(xx), que obliga a Flash a esperar xx segundos, sin importar si Ultraman puede seguir el ritmo o si ya llegó antes, debe esperar xx segundos.
Vea el código:
# -*- coding: utf-8 -*- from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get('https://huilansame.github.io sleep(3) # Espera forzada3seconds antes de ejecutar el siguiente paso print driver.current_url driver.quit()
Esto se llama espera forzada, no importa si el navegador ha cargado completamente, el programa debe esperar3seconds,3Después de que pasen los segundos, continúe ejecutando el código siguiente, lo que es muy útil para la depuración. A veces también se puede esperar de esta manera en el código, aunque no se recomienda usar este tipo de espera constantemente, ya que es muy rígido y puede afectar significativamente la velocidad de ejecución del programa.
2. Espera invisible
Otra manera es la espera invisible, implicitly_wait(xx), el significado de la espera invisible es: Flash y Ultraman acuerdan que, sin importar a dónde vaya Flash, tendrá que esperar a Ultraman xx segundos. Si Ultraman llega en este tiempo, ambos inmediatamente salen a luchar contra al monstruo. Si Ultraman no llega en el tiempo permitido, Flash se va solo, lo que significa que naturalmente esperará a que Ultraman le lance una excepción.
Vea el código:
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(30) # Espera invisible, tiempo máximo de espera30 seconds driver.get('https://huilansame.github.io print driver.current_url driver.quit()
La espera invisible establece un tiempo máximo de espera, si la carga de la página web se completa en el tiempo permitido, se ejecuta el siguiente paso, de lo contrario, se espera hasta que se agote el tiempo y luego se ejecuta el siguiente paso. Tenga en cuenta que aquí hay una desventaja, es que el programa esperará a que toda la página se cargue completamente, es decir, generalmente, cuando ya no vea el círculo pequeño girando en la barra de pestañas del navegador, se ejecutará el siguiente paso, pero a veces, los elementos que desea ya se han cargado, pero debido a que algunos elementos de js y otros son particularmente lentos, tengo que esperar a que toda la página se complete antes de poder ejecutar el siguiente paso. ¿Qué hago si quiero que el siguiente paso se ejecute tan pronto como aparezca el elemento que necesito? Hay una solución, y esto es lo que ofrece selenium con otro tipo de espera: la espera explícita wait.
Es necesario aclarar especialmente: la espera implícita actúa durante todo el ciclo del driver, por lo que solo se debe configurar una vez. He visto a algunas personas usar la espera implícita como sleep en todas partes...
3. Espera explícita
La tercera manera es la espera explícita, WebDriverWait, combinada con los métodos until() y until_not() de esta clase, permite esperar de manera flexible según las condiciones de juicio. Su principal significado es: el programa mira cada xx segundos, si se cumple la condición, se ejecuta el siguiente paso, de lo contrario, sigue esperando hasta que se supere el tiempo máximo configurado, luego lanza TimeoutException.
Veamos un ejemplo de código:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.implicitly_wait(10) # La espera implícita y explícita pueden usarse al mismo tiempo, pero hay que prestar atención: el tiempo máximo de espera es el mayor de los dos driver.get('https://huilansame.github.io locator = (By.LINK_TEXT, 'CSDN') try: WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) print driver.find_element_by_link_text('CSDN').get_attribute('href') finally: driver.close()
En el ejemplo anterior, hemos configurado el tiempo de espera implícito y explícito, en otras operaciones, el tiempo de espera implícito juega un papel decisivo, en WebDriverWait.. el tiempo de espera explícito juega un papel principal, pero es necesario prestar atención: el tiempo de espera máximo depende del mayor de los dos, en este caso es}}20, si el tiempo de espera implícito > tiempo de espera explícito, el tiempo de espera máximo de esta línea de código es igual al tiempo de espera implícito.
Principalmente utilizamos la clase WebDriverWait y el módulo expected_conditions, el autor llevará a cabo una revisión detallada de estos dos módulos:
WebDriverWait
La clase WebDriverWait del módulo wait es una clase de espera explícita, primero veamos qué parámetros y métodos tiene:
selenium.webdriver.support.wait.WebDriverWait(clase) __init__ driver: Se transmite la instancia de WebDriver, es decir, el driver en nuestro ejemplo anterior timeout: Tiempo de espera máximo, el tiempo más largo de espera (considerando también el tiempo de espera implícito) poll_frequency: Tiempo de intervalo de llamada al método de until o until_not, el valor predeterminado es 0.5segundos ignored_exceptions: Excepciones ignoradas, si se lanza esta excepción en el proceso de llamada a until o until_not, no se interrumpirá el código y se continuará esperando, si se lanza una excepción fuera de este grupo, se interrumpirá el código y se lanzará una excepción. El valor predeterminado es NoSuchElementException. until method: Durante el período de espera, se llama a este método introducido a intervalos regulares hasta que el valor devuelto no sea False message: Si ocurre un tiempo de espera, se lanza TimeoutException, y se transmite message al异常 until_not es lo contrario de until, until es cuando un elemento aparece o una condición se cumple para continuar la ejecución, mientras que until_not es cuando un elemento desaparece o una condición no se cumple para continuar la ejecución, los parámetros son los mismos, no se repetirá. method message
Después de leer el contenido anterior, básicamente es claro, el método de llamada es el siguiente:
WebDriverWait(driver, tiempo_de_esperar, frecuencia_de_llamada, excepciones_ignoradas).hasta(método_ejecutable, información_devuelta_en_esperar_tiempo)
Es muy importante prestar atención a los métodos ejecutables de los parámetros de until o until_not, ya que mucha gente ha introducido objetos WebElement, como se muestra a continuación:
WebDriverWait(driver, 10.hasta(driver.find_element_by_id('kw')) # error
Esto es un uso incorrecto, los parámetros aquí deben ser llamables, es decir, este objeto debe tener un método __call__(), de lo contrario se lanzará una excepción:
TypeError: 'xxx' object is not callable
Aquí, puedes usar varios condiciones proporcionadas por el módulo expected_conditions de selenium, también puedes usar métodos como is_displayed() 、is_enabled()、is_selected() del WebElement, o usar métodos encapsulados por ti mismo, así que veamos las condiciones proporcionadas por selenium:
expected_conditions
expected_conditions es un módulo de selenium, que contiene una serie de condiciones que se pueden usar para juzgar:
selenium.webdriver.support.expected_conditions(módulo) Estas dos condiciones verifican el título, verifican si el parámetro de entrada title es igual o contiene driver.title title_is title_contains Estas dos condiciones verifican si un elemento aparece, los parámetros pasados son tuplas de tipo locator, como (By.ID, 'kw') Como su nombre indica, una pasa si se carga cualquier elemento que cumpla con las condiciones; la otra requiere que todos los elementos que cumplan con las condiciones se carguen presence_of_element_located presence_of_all_elements_located Estas tres condiciones verifican si un elemento es visible, los dos primeros pasan parámetros de tipo tupla locator, el tercero pasa WebElement La primera y la tercera son esencialmente lo mismo visibility_of_element_located invisibility_of_element_located visibility_of Estas dos condiciones juzgan si un texto específico aparece en un elemento, una juzga el texto del elemento, la otra juzga el valor del elemento text_to_be_present_in_element text_to_be_present_in_element_value Esta condición juzga si el frame es accesible y puede ser cambiado, se puede pasar un tupla de locator o directamente pasar el modo de ubicación: id, name, index o WebElement frame_to_be_available_and_switch_to_it Esta condición juzga si aparece alert alert_is_present Esta condición determina si un elemento es clickable, recibe locator element_to_be_clickable Estas cuatro condiciones determinan si un elemento está seleccionado, la primera condición recibe un objeto WebElement, la segunda recibe un tupla de locator La tercera condición recibe un objeto WebElement y un estado, devuelve True si son iguales, de lo contrario devuelve False La cuarta condición recibe locator y estado, devuelve True si son iguales, de lo contrario devuelve False element_to_be_selected element_located_to_be_selected element_selection_state_to_be element_located_selection_state_to_be La última condición�断定一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了 staleness_of
El siguiente es todo17Una condición, combinada con until y until_not, puede realizar muchas Judgmentes, y si puede encapsularse de manera flexible, aumentará enormemente la estabilidad del script.
El siguiente es un análisis detallado de los tres métodos de espera de Python selenium presentados por el editor, esperamos que les sea útil a todos. Si tienen alguna pregunta, no duden en dejar un mensaje, el editor responderá a tiempo. ¡También agradecemos muchísimo el apoyo de todos a la página web de tutorial de grito!
Declaración: Este artículo se ha obtenido de la red, el derecho de autor pertenece al propietario original, el contenido se ha subido de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano y no asume la responsabilidad de las responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w.3Declaración: El contenido de este artículo se ha obtenido de la red, el derecho de autor pertenece al propietario original, el contenido se ha subido de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano y no asume la responsabilidad de las responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando evidencia relevante, una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.