Попытка использовать WebDriverWait до тех пор, пока presence_of_element_located вместо sleep.time в Selenim Python

#python #selenium #webdriverwait

Вопрос:

У меня есть этот фрагмент кода, который работает как есть:

 time.sleep(0.7)

self.driver.find_element_by_xpath("anyXpath").click()  
 

Я заставляю программу ждать некоторое время, чтобы действительно можно было нажать кнопку во всплывающем окне, и это решение работает.
Теперь я хочу сделать то же самое, но с WEbDriverWait , и я написал это:

 WebDriverWait(self.driver,10).until(expected_conditions.presence_of_element_located(By.XPATH, "anyXpath"))

self.driver.find_element_by_xpath("anyXpath").click()    
 

Но кнопка никогда не нажимается. Что я делаю не так? Я готов использовать другое ожидаемое условие, отличное от presence_of_element_located, но я думаю, что оно также должно работать с последним.
Спасибо.

Комментарии:

1. Используйте элемент для кликабельности, а затем используйте .click() после него.

Ответ №1:

Импортируя WebDriverWait , expected_conditions , и By , вы можете подождать, пока веб-драйвер не сочтет элемент кликабельным, прежде чем он щелкнет по элементу.

 from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait

WebDriverWait(10, self.driver).until(
    expected_conditions.element_to_be_clickable(
        (By.XPATH, "//xpath//to//element")
    )
).click()
 

Убедитесь, что вы передаете кортеж element_to_be_clickable() кому .

Комментарии:

1. Спасибо! Кажется, теперь это работает, я поменял позиции «10» и «драйвер», хотя и использовал «self.driver» вместо «драйвер».

Ответ №2:

Вы можете попробовать этот метод. Он ждет, пока элемент будет доступен для щелчка

 WebDriverWait(10, driver).until(EC.element_to_be_clickable(By.XPATH, "anyXpath"))
 

импортировать

 from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
 

Комментарии:

1. Это тоже не работает. Вы написали «(10, драйвер)», и я попробовал использовать «10» и «драйвер»/»self.driver» в разных положениях внутри скобок. Я также использовал expected_conditions вместо EC, что, я думаю, одно и то же.

2. Является ли часть element_to_be_clickable работой ? Он ждет, пока html-элемент станет доступным для кликабельности

3. Если [element_to_be_clickable] не работает ? Я думаю, что проблема в всплывающем окне. Возможно, вам потребуется переключиться на это окно, прежде чем вы нажмете кнопку.

4. Проблема заключается в переданных значениях element_to_be_clickable . Эта функция принимает кортеж. Также By не был импортирован.

5. Убедитесь, что вы импортируете все необходимое. [element_to_be_clickable] требуется только локатор, поэтому я думаю, вам следует еще раз проверить, правильно ли вы ввели локатор.