使用 Selenium python,在等待隐藏按钮出现并可点击时是否需要刷新页面?

With Selenium python, do I need to refresh the page when waiting for hidden btn to appear and be clickable?

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

首先,我不太确定仅通过 class 名称减去“隐藏”部分进行搜索是否会真正找到正确的元素,但更大的问题是我不知道是否按钮仅在刷新页面后可见。如果我需要刷新,那么它会很烦人,因为大多数网站在发现机器人正在访问该网站时都会为 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"))

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