56

我有一个 Selenium 脚本(Python),它单击回复按钮以使类anonemail出现。类 anonemail 出现所需的时间各不相同。因此,我必须使用 sleep 直到元素出现。

我想等到课程出现而不是使用睡眠。我听说过等待命令,但我不知道如何使用它们。

这是我迄今为止所拥有的:

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

5 回答 5

85

根据最佳实践:

  • 如果您的用例是验证任何元素的存在,您需要诱导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_conditionsvisibility_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()
    

参考

您可以在以下位置找到一些详细的讨论:

于 2019-12-01T21:51:34.757 回答
28

点击回复按钮后,使用.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

等待文档

于 2019-12-02T03:33:24.607 回答
8

您可以使用等待。在Selenium 等待中查看更多信息。

在下面的示例中,我们使用函数visibility_of_element_located等待 10 秒以使元素可见。

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()
于 2019-12-01T21:44:58.287 回答
5

您可以使用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")
于 2019-12-01T21:47:07.527 回答
-1

这对我来说很有效:

from selenium import webdriver, common

browser = webdriver.Chrome()
browser.get("www.yourwebpage.com")

while True:
    try:
        email = browser.find_element_by_css_selector(".anonemail").get_attribute("value")
        break
    except common.exceptions.NoSuchElementException:
        print("Fail.")

print(email)
于 2021-11-02T00:14:17.400 回答