Selenium - 等到元素出现、可见且可交互
- 2024-11-15 08:36:00
- admin 原创
- 14
问题描述:
我有一个 Selenium 脚本 (Python),单击回复按钮即可显示anonemail类。anonemail 类显示所需的时间各不相同。因此,我必须使用 sleep 直到元素出现。
我想等到类出现,而不是使用 sleep。我听说过 wait 命令,但我不知道如何使用它们。
这是我目前所拥有的:
browser.find_element_by_css_selector(".reply-button").click()
sleep(5)
email=browser.find_element_by_css_selector(".anonemail").get_attribute("value")
解决方案 1:
按照最佳实践:
如果您的用例是验证任何元素的存在,则需要诱导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_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设置expected_conditions,这element_to_be_clickable()
是检查元素是否可见且已启用以便您可以单击它的期望。因此,在您的用例中,代码行实际上是:
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
参考
您可以在以下位置找到一些详细的讨论:
WebDriverWait 未按预期工作
硒:检查元素的存在
解决方案 2:
点击回复按钮后,使用.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
等待文档
解决方案 3:
您可以使用等待。在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()
解决方案 4:
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`可**点击**时,请将按钮返回给我!*
- ***clickable***存在于 DOM 上,可见且可点击。隐藏元素或不可点击元素是**不够**的!
解决方案 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")
解决方案 6:
我也遇到了和你类似的问题。我尝试使用implicit_wait()
和WebDriverWait
,但是没有效果。
implicit_wait(10)
因此我解决了在实例中设置的问题web driver
并使用此代码片段单击按钮:
element = driver.find_elements_by_xpath("//button[contains(string(), 'Log In')]")[0]
driver.execute_script("arguments[0].click();", element)
解决方案 7:
在 Selenium 中,等待元素存在、可见且可交互是确保测试脚本稳健可靠的常见要求。您可以通过使用 WebDriverWait 和 ExpectedConditions 来实现这一点。以下是使用 Python 执行此操作的方法:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Initialize WebDriver
driver = webdriver.Chrome()
# Navigate to a page
driver.get("https://example.com")
# Define a wait with a timeout of 10 seconds
wait = WebDriverWait(driver, 10)
# Wait until element is present, visible, and interactable
element = wait.until(EC.element_to_be_clickable((By.ID, "your_element_id")))
# Once the element is found, you can interact with it
element.click()
# After you are done, don't forget to close the browser
driver.quit()
在此脚本中:
WebDriverWait 用于等待最多 10 秒。
EC.element_to_be_clickable 是一个预期条件,等待
元素出现在 DOM 中并且可点击。
您可以将“your_element_id”替换为您想要与之交互的元素的适当选择器,例如 ID、class 或 XPath。
一旦找到元素,您就可以根据需要与其进行交互。最后,请记住在完成操作后关闭浏览器。
此方法可确保您的脚本等待元素完全加载、可见并准备好交互后再继续执行任何操作,这有助于创建稳定可靠的测试自动化脚本。
解决方案 8:
现代 Python Selenium 框架在执行点击等操作之前已经包含了智能等待功能。例如,这是一个用于测试演示电子商务网站的SeleniumBase脚本:
from seleniumbase import SB
with SB() as sb:
sb.open("https://www.saucedemo.com/")
sb.type("input#user-name", "standard_user")
sb.type("input#password", "secret_sauce")
sb.click("input#login-button")
sb.click('button[id="add-to-cart-test.allthethings()-t-shirt-(red)"]')
sb.click("div#shopping_cart_container a")
sb.click("button#checkout")
sb.type("input#first-name", "SeleniumBase")
sb.type("input#last-name", "Rocks")
sb.type("input#postal-code", "01720")
sb.click("input#continue")
sb.click("button#finish")
sb.assert_exact_text("Thank you for your order!", "h2")
此外,如果您仍想使用某些简单的方法,也可以使用它们来等待某些事情。例如:
sb.wait_for_element_present(selector)
sb.wait_for_element_visible(selector)
sb.wait_for_element_clickable(selector)
(selector
自动检测,这意味着您不再需要指定 CSS 与 XPath。)
Selenium“最佳实践”现在建议使用包含智能等待功能的框架:
这意味着不再使用像这样的长线:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button"))).click()
相反,请使用一个框架来做这样的事情:
sb.click("button")
如果您要查找的元素在默认超时内从未出现,它会更加干净,同样可靠,并且会显示更好的错误消息。
SeleniumBase等框架在 Selenium 生态系统页面上列出: https: //www.selenium.dev/ecosystem/#frameworks
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件