selenium --等到元素存在、可见和可交互

odopli94  于 2022-11-10  发布在  其他
关注(0)|答案(6)|浏览(178)

我有一个Selify脚本(Python),它可以单击回复按钮来显示类anonmail。班级出现电子邮件的时间长短不一。因此,我必须使用睡眠,直到元素出现。
我想等到上课后再来,而不是用睡眠。我听说过等待命令,但我不知道如何使用它们。
这就是我到目前为止所拥有的:

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

8yoxcaq71#

根据最佳实践:

  • 如果您的用例是验证任何元素的存在,则需要诱导WebDriverWait将Expect_Conditions设置为presence_of_element_located()presence_of_element_located()是检查元素是否出现在页面DOM上的期望。这并不一定意味着元素是可见的。因此,有效的代码行将是:
WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".reply-button"))).click()
  • 如果您的用例是提取任何元素的任何属性,您需要诱导WebDriverWait将Expect_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将Expect_Conditions设置为element_to_be_clickable(),这是检查元素是否可见并启用以便您可以点击它的期望。因此,在您的用例中,有效的代码行将是:
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()

参考资料

您可以在中找到几个详细的讨论:

  • WebDriverWait未按预期工作
  • selenium :检查元素的存在
3j86kqsm

3j86kqsm2#

点击回复按钮后,使用如下所示的.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

Waits documentation

xkrw2x1b

xkrw2x1b3#

你可以使用等待。有关详细信息,请访问*Selenium waits
在下面的示例中,我们使用函数
Visiance_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()
fkvaft9z

fkvaft9z4#

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

mum43rcc5#

  • 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上存在且可见并可点击。隐藏元素或不可点击**还不够好!

w9apscun

w9apscun6#

我和你也有类似的问题。我尝试使用implicit_wait()WebDriverWait,但它们不起作用。
因此,我解决了在web driver示例中设置implicit_wait(10)并使用以下代码片段单击按钮的问题:

element = driver.find_elements_by_xpath("//button[contains(string(), 'Log In')]")[0]
driver.execute_script("arguments[0].click();", element)

相关问题