首页 > 解决方案 > 无法在 Python Selenium 中正确使用 WebDriverWait 库

问题描述

大家好,我最近正在学习 selenium,因为我打赌这是一个经典的新手错误,所以我用 time.sleep 填充了我的代码,这让一切变得非常缓慢。于是开始学习webdriverWait。我采用了一些示例代码,并尝试了多种方法,但仍然收到“您单击的内容被其他内容阻止”的错误,这意味着库没有崩溃,但它也没有做任何事情。这一定意味着我做错了什么。如果使用 time.sleep 函数,这是我可以避免的错误。

我在 WebDriverWait 旁边使用了预期条件、BY 和动作链,尽管在我上次的测试中,我尝试不使用 Acton 链来降低其失败的可能性。

我正在使用一个可能在 NDA 下的公司网站,所以我没有公开的例子来展示这个,我尝试搜索“带有封面开口的页面”但我找不到任何东西,所以如果你们知道任何我可以用来说明这一点的东西,我都会觉得这真的很有帮助。正在发生的事情是该站点加载了“封面”动画,几秒钟后动画消失以显示我正在寻找的按钮。

环境信息:

这是我的代码片段:

尝试#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()

标签: pythonseleniumselenium-webdriverselenium-chromedriver

解决方案


推荐阅读