Вопрос-Ответ

Selenium - wait until element is present, visible and interactable

Selenium - дождитесь, пока элемент не станет присутствующим, видимым и интерактивным

У меня есть скрипт Selenium (Python), который нажимает кнопку ответа, чтобы появился класс anonemail. Время, необходимое для появления класса anonemail, варьируется. Из-за этого мне приходится использовать режим ожидания до тех пор, пока элемент не появится.

Я хочу дождаться появления класса вместо использования sleep . Я слышал о командах wait, но я не знаю, как их использовать.

Это то, что у меня есть на данный момент:

browser.find_element_by_css_selector(".reply-button").click()
sleep(5)
email=browser.find_element_by_css_selector(".anonemail").get_attribute("value")
Переведено автоматически
Ответ 1

В соответствии с лучшими практиками:


  • Если ваш вариант использования заключается в проверке присутствия какого-либо элемента, вам нужно вызвать WebDriverWait, установив expected_conditions как presence_of_element_located(), которые являются ожидаемыми для проверки присутствия элемента в DOM страницы. Это не обязательно означает, что элемент виден. Таким образом, эффективная строка кода будет:


    WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".reply-button"))).click()


  • Если ваш вариант использования заключается в извлечении любого атрибута любого элемента, вам нужно вызвать WebDriverWait, установив expected_conditions как visibility_of_element_located(locator), что является ожиданием для проверки того, присутствует ли элемент в DOM страницы и виден ли он. Видимость означает, что элемент не только отображается, но и имеет высоту и ширину, превышающие 0. Таким образом, в вашем случае использования фактически строка кода будет иметь вид:


    email = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "element_css"))).get_attribute("value")


  • Если ваш вариант использования заключается в вызове click() для любого элемента, вам нужно вызвать WebDriverWait, установив expected_conditions как element_to_be_clickable() ожидаемый параметр для проверки того, что элемент виден и включен, чтобы вы могли щелкнуть по нему. Таким образом, в вашем случае использования фактически строка кода будет:


    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()



Ссылки

Вы можете найти пару подробных обсуждений в:

Ответ 2

После нажатия кнопки Ответить используйте .visibility_of_element_located следующее:

browser.find_element_by_css_selector(".reply-button").click()

# Wait for initialize, in seconds
wait = WebDriverWait(browser, 10)

email = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.anonemail'))).get_attribute("value")
print(email)

Следующий импорт:

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

Документация ожидает

Ответ 3

Вы можете использовать waits . Проверьте дополнительную информацию в Selenium waits .

В приведенном ниже примере мы ждем 10 секунд, пока элемент не станет видимым, используя функцию visibility_of_element_located.

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
Ответ 4

  • WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".reply-button"))):



    • Эй, драйвер, подождите (0-5 секунд), когда увидите, что .reply-button есть присутствие, верните мне эту кнопку!

      • присутствие присутствует в DOM. Скрытый элемент достаточно хорош.





  • WebDriverWait(driver, 5).until( EC.visibility_of_element_located((By.CSS_SELECTOR, ".reply-button”)))):



    • Эй, драйвер, подождите (0-5 секунд), когда увидите, что .reply-button это видимость, верните мне эту кнопку!

      • видимость присутствует и видна в DOM. Скрытый элемент недостаточно хорош!





  • WebDriverWait(driver, 5).until( EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button”)))):



    • Эй, драйвер, подождите (0-5 секунд), когда увидите, что .reply-button он кликабелен, верните мне эту кнопку!

      • интерактивность присутствует, видна и кликабельна в DOM. Скрытый элемент или некликабельный - это не достаточно хорошо!





Другие доступные условия

python selenium selenium-webdriver