使用 Selenium python,在等待隐藏按钮出现并可点击时是否需要刷新页面?
With Selenium python, do I need to refresh the page when waiting for hidden btn to appear and be clickable?
我正在尝试制作一个小程序,在隐藏按钮处查看网页(在 class 中使用隐藏按钮)并在单击它之前等待它可单击。代码如下。我想知道 WebDriverWait
和 element_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"))
我认为刷新对隐藏元素没有帮助...
我正在尝试制作一个小程序,在隐藏按钮处查看网页(在 class 中使用隐藏按钮)并在单击它之前等待它可单击。代码如下。我想知道 WebDriverWait
和 element_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"))
我认为刷新对隐藏元素没有帮助...