Espera sin bloqueo en selenium usando Python

Requisito previo: Automatización del navegador usando Selenium
Cuando queremos hacer la automatización web, debemos esperar a que se carguen algunos elementos de JavaScript antes de realizar alguna acción. De hecho, generalmente la gente usa 

Python3

time.sleep(in_seconds)

que es una llamada de bloqueo.
Al bloquear la llamada, quiero decir que espera o, más bien, hace que el programa duerma durante los segundos mencionados, sin importar lo que suceda. Esta no es una buena idea ya que aumenta la latencia al hacer que el programa sea efectivamente más lento.

La posible solución a esto es esperar hasta que aparezca un elemento y no esperar más que eso. 

Requisitos previos: Python instalado y Selenium instalado como paquete junto con el controlador web (archivo .exe)
Para Python Web Automation con Selenium, esto se puede lograr de la siguiente manera:

Digamos que desea iniciar sesión en GeeksForGeeks a través de la automatización web y completar las credenciales de inicio de sesión tan pronto como los elementos de nombre de usuario y contraseña estén visibles en la página web y no espere hasta que se cargue toda la página.

Paso 1:
configura el controlador web de la siguiente manera: 

Python3

from selenium import webdriver
 
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
options.add_argument("disable-infobars")
 
chrome = webdriver.Chrome(the_path_of_webdriver_which_is_an_exe,
                          chrome_options = options, service_args =['--ignore-ssl-errors = true'])
 
login_uri = 'https://auth.geeksforgeeks.org/'
username = 'something'
password = 'anything'
username_xpath = '//*[@id ="luser"]'
password_xpath = '//*[@id ="password"]'
sign_in_xpath = '//*[@id ="Login"]/button'
 
chrome.get(login_uri)

Aquí he usado el controlador web de Chrome que comenzaría maximizado (ventana completa) sin barras de información, es decir, no dirá que Chrome está siendo controlado por el código de automatización y cargará la página de inicio de sesión de GFG sin ningún problema.

Tenga en cuenta que para encontrar el xpath de estos elementos, debe ingresar al modo desarrollador e inspeccionar estos elementos.

Paso 2: 

Python3

# return True if element is visible within 30 seconds, otherwise False
def is_visible(locator, timeout = 30):
    try:
        ui.WebDriverWait(chrome, timeout).until(EC.visibility_of_element_located((By.XPATH, locator)))
        return True
    except TimeoutException:
        return False

La función anterior is_visible facilita la llamada sin bloqueo que pretendemos discutir aquí. 
Explicación: 
1) locator: el xpath del elemento 
2) tiempo de espera: hasta cuándo esperar a que aparezca el elemento (porque no queremos esperar para siempre) 
3) chrome: el objeto webdriver que inicializamos anteriormente 
4) Utiliza el utilidad inbuild de ui para hacer que el controlador web espere hasta que el elemento sea visible (identificado por xpath) 
5) si aparece dentro del tiempo de espera, devuelve True else False

Paso 3:
Así es como utilizamos la función: 

Python3

if not is_visible(username_xpath): raise RuntimeError("Something went wrong with the username field :(")
username_field = chrome.find_element_by_xpath(username_xpath)
username_field.send_keys(username)
 
if not is_visible(password_xpath): raise RuntimeError("Something went wrong with the password field :(")
password_field = chrome.find_element_by_xpath(password_xpath)
password_field.send_keys(password)
 
if not is_visible(sign_in_xpath): raise RuntimeError("Something went wrong with the sign in field :(")
sign_in_btn = chrome.find_element_by_xpath(sign_in_xpath)
sign_in_btn.click()

Aquí llamamos a la función is_visible y pasamos el xpath del nombre de usuario, la contraseña y el botón de inicio de sesión respectivamente y esperamos a que el elemento aparezca dentro del tiempo de espera (aquí 30 s). Si no está visible, generamos un RuntimeError con el mensaje correspondiente.
Si aparece en cualquier momento antes de los 30, continúa y encuentra el elemento por xpath (ya que ahora está visible en la página web, por lo que esta llamada no generaría un error de excepción).

Luego enviamos los datos y hacemos clic en iniciar sesión y puedes disfrutar aprendiendo en GFG sin ningún bloqueo de llamadas 😛
 

Publicación traducida automáticamente

Artículo escrito por ammar53 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *