Selenium - подождать, пока элемент не появится, станет видимым и интерактивным - PullRequest
1 голос
/ 02 декабря 2019

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

Это то, что я имею до сих пор:

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

Ответы [ 4 ]

2 голосов
/ 02 декабря 2019

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

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

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
    
  • Если ваш сценарий использования , извлеките любой атрибут любого элемента, который вам нужно вызвать WebDriverWait установка ожидаемых_условий как 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 , установив Ожидаемые условия как element_to_be_clickable(), который являетсяожидание проверки элемента является видимым и включенным, так что вы можете щелкнуть по нему. Таким образом, в вашем случае использования строка кода будет:

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

Ссылки

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

0 голосов
/ 02 декабря 2019

После нажатия кнопки reply используйте .visibility_of_element_located, как показано ниже:

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

#wait 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

Ожидание документов

0 голосов
/ 02 декабря 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")
0 голосов
/ 02 декабря 2019

Вы можете использовать ожидания. Проверьте дополнительную информацию по этой ссылке: selenium watis

На приведенном ниже примере мы ждем 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...