python - 使用 Selenium python,在等待隐藏的 btn 出现并可以点击时是否需要刷新页面?
问题描述
我正在尝试制作一个小程序,它在隐藏按钮处查看网页(在类中使用隐藏)并等待它在单击之前可单击。代码如下。我想知道WebDriverWait
andelement_to_be_clickable
函数是否已经通过刷新,或者我是否必须手动刷新页面。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.common.exceptions import WebDriverException
driver = webdriver.Firefox()
driver.get(<URL>)
print("beginning 120s wait")
time.sleep(120)
print("finished 120s wait")
try:
element = WebDriverWait(driver, 1000).until(
EC.element_to_be_clickable((By.CLASS_NAME, "btn add"))
)
print("It went through")
element.click()
driver.execute_script("alert('It went through!');")
finally:
driver.execute_script("alert('Did it work?');")
首先,我不确定仅通过类名减去“隐藏”部分搜索是否真的会找到正确的元素,但更大的问题是我不知道按钮是否只有在刷新页面后才可见. 如果我需要刷新,那会很烦人,因为大多数网站在发现机器人正在访问该网站时都会为 Firefox 或 Chrome 提供额外的验证码。(这就是为什么我有最初的睡眠:这样我就可以先手动完成任何验证码)
那么,我是否需要刷新我的代码,或者没有它会好吗?如果我确实需要它,我该如何实现它?我只是像这样添加它:
try:
element = WebDriverWait(driver, 1000).until(
drive.refresh()
EC.element_to_be_clickable((By.CLASS_NAME, "btn add"))
)
很抱歉,如果这已经在其他地方得到了回答,我搜索了一堆,但我还没有在这个网站上找到答案。
解决方案
首先,您不应该使用正确的sleep
方法来解决问题。WebDriverWait
EC
至于EC.element_to_be_clickable
这是函数背后的代码:
def element_to_be_clickable(locator):
""" An Expectation for checking an element is visible and enabled such that
you can click it."""
def _predicate(driver):
element = visibility_of_element_located(locator)(driver)
if element and element.is_enabled():
return element
else:
return False
return _predicate
如您所见,该EC.element_to_be_clickable
功能不会刷新浏览器。
如果您坚持需要刷新,那么正确的实现方法将是:
try:
element = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.CLASS_NAME, "btn add"))
except (NoSuchElementException, StaleElementReferenceException):
driver.refresh()
element = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.CLASS_NAME, "btn add"))
我认为刷新对隐藏元素没有帮助......
推荐阅读
- r - 从 www 子目录为 R shinydashboard 链接 JS 文件
- sql - 如何在两列之间添加列?
- php - 隐藏在 Woocommerce 仪表板中,针对来自 Woocommerce 的特定用户角色“订单”子菜单
- c# - C# 中的 TripleDES 算法
- java - 如何解决此问题 org.json.JSONException: 类型 java.lang.String 的值数据库无法转换为 JSONObject
- javascript - Counting rel number from html selectbox with jquery
- c# - 在对象内连接字符串?
- java - Api 与 Postman 一起工作,但不适用于 Android 应用程序
- filebeat - 我想排除 filebeat 读取的日志中的某些行,并且还想通过在 filebeat 中使用处理器来添加标签,但它不起作用
- elasticsearch - Exact-match, case-insensitive match without normalization in Elasticsearch 6.2