WebDriverWait no funciona como se esperaba

Estoy trabajando con selenium para raspar algunos datos.

Hay un botón en la página en el que hago clic en decir “custom_cols”. Este botón me abre una ventana donde puedo seleccionar mis columnas.

Esta nueva ventana a veces tarda un poco en abrirse (alrededor de 5 segundos). Así que para manejar esto he usado

WebDriverWait 

Con retraso de 20 segundos. Pero algunas veces falla al seleccionar buscar elementos en una nueva ventana, incluso si el elemento es visible. Esto sucede solo una vez en diez veces por el rest del tiempo que funciona correctamente.

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

Mi pregunta es por qué los elementos de la nueva ventana no son visibles aunque estoy esperando que el elemento se haga visible. Para agregar aquí, he intentado boost el tiempo de retardo, pero de todos modos me sale 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 esperas el elemento y avanzas mientras intentas invocar el método click() lugar de usar el método presence_of_element_located() , necesitas usar element_to_be_clickable() siguiente manera:

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

Actualizar

Según su pregunta en el contador, aquí están los detalles de los tres métodos:

presencia_de_elemento_locado

presence_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 (ie clickable). 

visibilidad_de_elemento_locado

visibilidad_de_elemento_locado (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 (ie clickable). Description : An Expectation for checking an element is visible, enabled and interactable such that you can click it.