python - 无法在 Python Selenium 中正确使用 WebDriverWait 库
问题描述
大家好,我最近正在学习 selenium,因为我打赌这是一个经典的新手错误,所以我用 time.sleep 填充了我的代码,这让一切变得非常缓慢。于是开始学习webdriverWait。我采用了一些示例代码,并尝试了多种方法,但仍然收到“您单击的内容被其他内容阻止”的错误,这意味着库没有崩溃,但它也没有做任何事情。这一定意味着我做错了什么。如果使用 time.sleep 函数,这是我可以避免的错误。
我在 WebDriverWait 旁边使用了预期条件、BY 和动作链,尽管在我上次的测试中,我尝试不使用 Acton 链来降低其失败的可能性。
我正在使用一个可能在 NDA 下的公司网站,所以我没有公开的例子来展示这个,我尝试搜索“带有封面开口的页面”但我找不到任何东西,所以如果你们知道任何我可以用来说明这一点的东西,我都会觉得这真的很有帮助。正在发生的事情是该站点加载了“封面”动画,几秒钟后动画消失以显示我正在寻找的按钮。
环境信息:
- 使用 Pycharm 社区最新版本
- 使用 Selenium 4.0.0b2.post1(我也在 3.9 中尝试过,但没有结果)
- 使用 ChromeDriver 89 作为我的 google chrome 版本也是 89 [Chrome 版本 89.0.4389.114]
这是我的代码片段:
尝试#1:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
import selenium.webdriver.support.ui as ui
def test(driver, actions, delay):
cart = "//header/div[1]/div[1]/a[2]/*[1]"
cartxp = WebDriverWait(driver, delay).until(EC.visibility_of_element_located((By.XPATH, cart)))
actions.move_to_element(cartxp).perform()
cartclk = driver.find_element_by_xpath(cart).click()
尝试#2:使用 UI 库
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
import selenium.webdriver.support.ui as ui
def test2(driver, delay, actions):
cart = "//header/div[1]/div[1]/a[2]/*[1]"
cartxp = ui.WebDriverWait(driver, delay).until(EC.visibility_of_element_located((By.XPATH, cart)))
actions.move_to_element(cartxp).perform()
cartclk = driver.find_element_by_xpath(cart).click()
尝试#3:不使用动作链
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.common.by import By
def test3(driver, delay):
wait = WebDriverWait(driver, delay)
cart = "//header/div[1]/div[1]/a[2]/*[1]"
button = wait.until(EC.element_to_be_clickable((By.XPATH, cart)))
cartclk = driver.find_element_by_xpath(cart).click()
所有这些都有一个主要的方法,它只有:
driver = webdriver.Chrome()
test3(driver, 30)
driver.get('Site that I cant reveal cuz of NDA')
action = ActionChains(driver)
我得到的错误是:
消息:元素点击被拦截:元素 ... 在点 (1183, 27) 处不可点击。其他元素会收到点击
提前感谢您的帮助!
编辑:在一些评论之后将我的 xpath 更改为 //a[@class='header__cart'] 前一个和这个都导致一个结果如果我在 chrome 检查上使用它来查找按钮,另外它会按预期工作如果在使用 time.sleep() 等待动画结束后,我使用它来实际单击按钮
此外,以防万一尝试使用 try catch,就像他们在建议的问题上所做的那样。也失败了
尝试4:包围在try-catch中
def test4(driver, delay):
cart = "//a[@class='header__cart']"
try:
my_elem = WebDriverWait(driver, delay).until(EC.visibility_of_element_located((By.XPATH, cart)))
print
"Page is ready!"
except TimeoutException:
print
"Loading took too much time!"
cart_btn = driver.find_element_by_xpath(cart)
cart_btn.click()
错误:selenium.common.exceptions.ElementClickInterceptedException:消息:元素点击被拦截:元素 <a href="/cart" class="header__cart" data-items-in-cart="0" )="">... 是在点 (1200, 27) 处不可点击。其他元素会收到点击
为了澄清我之前的意思,这行得通:
cart = "//a[@class='header__cart']"
time.sleep(20)
cartclk = driver.find_element_by_xpath(cart).click()
解决方案
推荐阅读
- scala - 带有迭代器的 Scala for 循环得到了意想不到的结果
- python - 我使用 pyserial 模块,但只能读取,不能发送数据并阻塞
- python-3.x - 从 Azure 函数(将由 Snowflake 程序使用)发送电子邮件,而不使用任何第三方 API,如 SendGrid
- python - SyntaxError:小饰品 main.py 中第 16 行的错误输入
- c# - WPF 中的调度程序和异步等待
- mecab - 如何将 mecab-ko 作为 AWS Lambda 层?
- linear-programming - 如何约束线性程序,使所有连续变量具有最小正值但也可以为 0
- firebase - 如何从 Flutter Firestore 或实时数据库中的两个不同分支获取数据?
- javascript - 在同一个 repo webpack 中的项目之间共享逻辑
- angularjs - 在 mat-select multiple 中更改复选框的大小