硒-等待元素存在,可见且可交互

时间:2019-12-01 21:36:13

标签: python selenium selenium-webdriver webdriverwait expected-condition

我有一个硒脚本(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 个答案:

答案 0 :(得分:2)

根据最佳做法:

  • 如果您的用例是验证任何元素的存在,则需要引起WebDriverWait,将expected_conditions设置为presence_of_element_located(),这是期望值用于检查页面的DOM上是否存在元素。这并不一定意味着该元素是可见的。因此,有效的代码行将是:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
    
  • 如果您的用例是要提取任何元素的任何属性,则需要引起WebDriverWaitexpected_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() ,则需要诱使WebDriverWaitexpected_conditions设置为element_to_be_clickable(),是期望检查元素是否可见并已启用,以便您可以单击它。因此,在您的用例中,有效的代码行将是:

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

参考

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

答案 1 :(得分:0)

您可以使用等待。检查有关此链接的更多信息:selenium watis

在下面的示例中,我们使用可视性_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()

答案 2 :(得分:0)

您可以使用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")

答案 3 :(得分:0)

点击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

Waits docs