Селен - подождите, пока элемент не появится, не станет видимым и с ним можно будет взаимодействовать

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

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

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

browser.find_element_by_css_selector(".reply-button").click()
sleep(5)
email=browser.find_element_by_css_selector(".anonemail").get_attribute("value")

person Benjamin Arvola    schedule 01.12.2019    source источник
comment
Есть ли в ответах адрес ожидания взаимодействия с элементом? Он может быть присутствующим и интерактивным, но при этом не готов к отправке ключей.   -  person Jeremy Kahan    schedule 21.07.2021


Ответы (4)


Согласно передовой практике:

  • Если ваш вариант использования заключается в проверке наличия любого элемента, который вам нужно вызвать, WebDriverWait, задающий expected_conditions как _ 1_, который является ожидаемым элементом присутствует в DOM страницы. Это не обязательно означает, что элемент виден. Итак, эффективная строка кода будет такой:

    WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".reply-button"))).click()
    
  • Если ваш вариант использования - извлечь любой атрибут любого элемента, вам нужно вызвать WebDriverWait, задающий expected_conditions как _ 3_, который является элементом ожидания присутствует в DOM страницы и виден. Видимость означает, что элемент не только отображается, но также имеет высоту и ширину больше 0. Таким образом, в вашем сценарии использования строка кода будет выглядеть так:

    email = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "element_css"))).get_attribute("value")
    
  • Если ваш вариант использования - вызвать click() для любого элемента, вам нужно вызвать WebDriverWait, задав expected_conditions как _ 6_, который является обязательным для проверки видимый и активный, так что вы можете щелкнуть по нему. Таким образом, в вашем сценарии использования строка кода будет выглядеть так:

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

использованная литература

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

person DebanjanB    schedule 01.12.2019

После нажатия кнопки Ответить используйте .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

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

person frianH    schedule 02.12.2019

Вы можете использовать ожидания. Дополнительную информацию см. В 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()
person daniboy000    schedule 01.12.2019

Вы можете использовать implicitly_wait:

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(15)
driver.get("http://url")
driver.find_element_by_id("id_of_element").click()

Он ждет, пока элемент не загрузится.

В вашем случае реализация будет такой:

browser.implicitly_wait(10)
browser.find_element_by_css_selector(".reply-button").click()
email = browser.find_element_by_css_selector(".anonemail").get_attribute("value")
person Mert Köklü    schedule 01.12.2019