WebDriverWait no funciona como se esperaba
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()
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.