2

我正在尝试制作一个小程序,它在隐藏按钮处查看网页(在类中使用隐藏)并等待它在单击之前可单击。代码如下。我想知道WebDriverWaitandelement_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"))

    )

很抱歉,如果这已经在其他地方得到了回答,我搜索了一堆,但我还没有在这个网站上找到答案。

4

1 回答 1

2

首先,您不应该使用正确的sleep方法来解决问题。WebDriverWaitEC

至于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"))

我认为刷新对隐藏元素没有帮助......

于 2020-12-15T09:15:59.203 回答