Análisis del código fuente de webdriver
En el proceso de automatización de la interfaz de usuario, inevitablemente encontrará problemas de carga, un entorno inestable y una velocidad de red lenta. Si no hace nada, se informará un error porque no se puede encontrar el elemento.
Otra situación es que la página utiliza el mecanismo de carga asincrónica ajax (ahora se reinicia, el cliente y el servidor están separados) y no sabes cuándo llegará la página. En este momento usaremos espera. En Selenium, tenemos tres tipos de espera, a saber, espera fija, espera implícita y espera explícita.
Time.Sleep
Espera fija, la esencia es: dejar que el hilo actual duerma, la esencia es bloquear el hilo, lo que se logra esperando.
Desventajas: Las malas condiciones de la red hacen perder tiempo y afectan gravemente el rendimiento del proyecto.
Beneficios: se pueden utilizar scripts de depuración.
Espera implícita
La espera implícita es esencialmente: establecer un tiempo máximo de espera al comienzo del script. Si la página web se carga dentro del tiempo especificado, continúe con el siguiente paso; de lo contrario, se puede generar una excepción. La espera implícita funciona durante todo el ciclo de conducción. Simplemente configúrela una vez al principio. No la trate como una espera fija.
Desventajas: JavaScript suele cargarse al final de nuestro cuerpo. De hecho, se han cargado todos los elementos de la página, pero todavía estamos esperando que se carguen todas las páginas.
WebDriverWait
Espera explícita, esencia: espera dinámica, para determinar si ha aparecido un elemento, como si el título se llama Baidu o Baidu Search, sondeo basado en algunas condiciones dinámicas. sondeará continuamente si la condición de detección es exitosa o fallida, por ejemplo, detectará si el elemento fue exitoso o falló una vez cada 0,5 segundos y establecerá el tiempo de espera de sondeo al mismo tiempo.
Si se configuran la espera explícita y la espera implícita al mismo tiempo, se ejecutará el que tenga el tiempo de espera más largo y el tiempo de espera más largo.
Espera explícita
Componente
Importar WebDriverWait desde el soporte del controlador web selenium. Espera
Código fuente de WebDriverWait
.# Licenciado para Software Freedom Conservancy (SFC)
# o licencias de múltiples contribuyentes. Consulte el documento de aviso
# distribuido con este libro para obtener más información
# sobre la propiedad de los derechos de autor. SFC otorga la licencia de este documento
# bajo la Licencia Apache, versión 2.0 (la
# "Licencia" no puede usarse excepto en cumplimiento de los requisitos
);#Traiga una licencia. Puede obtener una copia de la licencia en
#
# mon.exceptions import NoSuchElementException
Importar excepciones de tiempo de espera desde selenium.common.exceptions
POLL_FREQUENCY = 0.5 #Tiempo de suspensión entre llamadas a métodos
IGNORED _ EXCEPTIONS = (NoSuchElementException,) #Excepciones ignoradas al llamar a métodos
Clase WebDriverWait (objeto):
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignore_exceptions=None):
" " "Constructor, toma una instancia de WebDriver, tiempo de espera en segundos.
: Parámetros:
- Instancia del controlador WebDriver (es decir, Firefox, Chrome o Remote)
- tiempo de espera - Número de segundos antes del tiempo de espera
- poll_frequency - El intervalo de suspensión entre llamadas
De forma predeterminada, es 0,5 segundos
- ignore_exceptions - Estructura iterable de clases de excepción que se ignoran durante las llamadas.
De forma predeterminada, solo contiene NoSuchElementException.
Ejemplo:
Importar WebDriverWait desde selenium.webdriver.support.ui
elemento = WebDriverWait(controlador, 10). hasta que (lambda x:x. find _ element _ by _ id(" someId "))
está _ impresionado = controlador web wait(driver, 30, 1, (ElementNotVisibleException)).
hasta que _ not(lambda x:x . find _ element _ by _ id(" someId ").is_displayed())
"""
self._driver = conductor
self. _timeout = tiempo de espera
self. poll = poll_frequency
#evitar ceros
if self._poll == 0:
self._poll = POLL_frequency
excepciones = list(IGNORED_EXCEPTIONS)
si las excepciones_ignoradas no son Ninguna:
Intenta :
excepciones . extend(ITER(ignored _ excepciones))
Error de tipo de excepción: # ignore_exceptions no es iterable
excepciones .append(ignored_exceptions) p>
self. _ignored_exceptions = tupla(excepciones)
def __repr__(self):
Devuelve p>
tipo(self), self _driver. session_id)
def hasta(self, método, mensaje= ' '):
" "" Llamar al método proporcionado por el controlador como parámetro hasta
el valor de retorno no es falso. """
screen=None
stacktrace=None
end_time = time.time() + self._timeout
Aunque correcto :
Pruebe:
valor = método(self._driver)
si valor:
valor de retorno
Excepción excepto self _ignored_de la forma:
screen = getattr(exc,' screen',None)
stacktrace = getattr(exc,'stacktrace', None)
time.sleep(self._poll)
if time . time()> hora de finalización:
Roto
Genera una excepción de tiempo de espera (mensaje , pantalla, seguimiento de pila)
def Until_not(self, método, mensaje= ' '):
" " "Llame al método proporcionado por el controlador como parámetro, hasta p>
el valor de retorno es falso. """
end_time = time.time() + self._timeout
Aunque es correcto:
Pruebe:
Valor = método (self._driver)
si no es un valor:
valor de retorno
excepto self.
_Ignore_Exception:
Devuelve verdadero
time.sleep(self._poll)
if time.time()>hora de finalización:
time.sleep(self._poll)
p>
Roto
Provocar excepción de tiempo de espera (mensaje)
Parámetros:
Ejemplo de tres modos de espera
Desde Selenium importar webdriver
ir a dormir desde el momento
importar WebDriverEsperar desde selenium.webdriver.support.wait
importar la condición esperada de selenium.webdriver.support como EC
#Tres métodos de espera
Caso de prueba de clase (objeto):
def __init__(self ):
self.driver = webdriver. chrome()
self.driver.get(' ')
dormir(2)
def test_sleep(self):
autocontrolador. buscar _ elemento _ por _ id ('kw'). send_keys("selenium ")
sleep(2) #Implementación de hilo en modo de espera de bloqueo
self driver find _ element _ by _ id(' su '). click()
Dormir(3)
self.driver.quit()
def time_implicitly(self):
self . controlador . implícitamente _ esperar(10)
self controlador . send_keys("webdriver ")
self controlador buscar _ elemento _ por _ id(' su '). click()
#sleep(2)
self.driver.quit()
definir time_wait(self):
esperar = WebDriverWait(self.driver, 2, 0.5)
Wait.until(EC.title_is('Baidu, lo sabrás'))
self driver . '). send_keys("webdriver ")
self controlador buscar _ elemento _ por _ id(' su '). hacer clic()
dormir(2)
self.driver.quit()
if __name__=="__main__ ":
case=testcase()
#case.test_sleep()
# case.time_implicitly()
case.time_wait()