WebDriverWait no funciona como se esperaba

Resuelto Rao Sahab asked hace 6 años • 1 respuestas

Estoy trabajando con selenio para extraer algunos datos.

Hay un botón en la página en la que estoy haciendo clic que dice "custom_cols". Este botón me abre una ventana donde puedo seleccionar mis columnas.

Esta nueva ventana a veces tarda algún tiempo en abrirse (alrededor de 5 segundos). Así que para manejar esto he usado

WebDriverWait 

con un retraso de 20 segundos. Pero algunas veces no puede seleccionar buscar elementos en una nueva ventana, incluso si el elemento está visible. Esto sucede sólo una vez cada diez veces, durante el resto del tiempo funciona correctamente.

También he usado la misma función (WebDriverWait) en otros lugares y funciona como se esperaba. Quiero decir, espera hasta que los elementos se vuelven visibles y luego hace clic en el momento en que los encuentra.

Mi pregunta es por qué los elementos de la nueva ventana no son visibles aunque estoy esperando a que se hagan visibles. Para agregar aquí, intenté aumentar el tiempo de demora, pero aún recibo ese error de vez en cuando.

mi codigo esta aqui

def wait_for_elem_xpath(self, delay = None, xpath = ""):
    if delay is None:
        delay = self.delay

    try:
        myElem = WebDriverWait(self.browser, delay).until(EC.presence_of_element_located((By.XPATH , xpath)))
    except TimeoutException:
        print ("xpath: Loading took too much time!")
    return myElem
select_all_performance = '//*[@id="mks"]/body/div[7]/div[2]/div/div/div/div/div[2]/div/div[2]/div[2]/div/div[1]/div[1]/section/header/div'
self.wait_for_elem_xpath(xpath = select_all_performance).click()
Rao Sahab avatar Apr 11 '18 19:04 Rao Sahab
Aceptado

Una vez que espera el elemento y avanza mientras intenta invocar click()el método en lugar de usar presence_of_element_located()el método, debe usar element_to_be_clickable()lo siguiente:

try:
    myElem = WebDriverWait(self.browser, delay).until(EC.element_to_be_clickable((By.XPATH , xpath)))

Actualizar

Según su contrapregunta en los comentarios, aquí están los detalles de los tres métodos:

presencia_de_elemento_ubicado

presencia_of_element_located(localizador) se define de la siguiente manera:

class selenium.webdriver.support.expected_conditions.presence_of_element_located(locator)

Parameter : locator - used to find the element returns the WebElement once it is located

Description : An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible or interactable (i.e. clickable). 

visibilidad_del_elemento_ubicado

visibilidad_of_element_located(localizador) se define de la siguiente manera:

class selenium.webdriver.support.expected_conditions.visibility_of_element_located(locator)

Parameter : locator -  used to find the element returns the WebElement once it is located and visible

Description : An expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0.

element_to_be_clickable

element_to_be_clickable(localizador) se define de la siguiente manera:

class selenium.webdriver.support.expected_conditions.element_to_be_clickable(locator)

Parameter : locator - used to find the element returns the WebElement once it is visible, enabled and interactable (i.e. clickable).

Description : An Expectation for checking an element is visible, enabled and interactable such that you can click it. 
undetected Selenium avatar Apr 11 '2018 12:04 undetected Selenium