【问题标题】:Python - Refresh page until Element is clickablePython - 刷新页面直到元素可点击
【发布时间】:2021-12-26 13:04:32
【问题描述】:

我正在尝试创建这个机器人,它会刷新页面直到元素可见。 我的问题是机器人没有刷新,我似乎无法弄清楚为什么:)

编辑:机器人现在刷新所需的页面,直到所需的元素可见,但是机器人不会单击它正在寻找的所需元素,而且我似乎无法弄清楚为什么,因为代码显示“element.click ()"

I believe that this is the logs

from selenium import webdriver
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


driver = webdriver.Chrome(executable_path="C:\webdrivers\chromedriver.exe")


driver.get("xxx")

driver.maximize_window()


click = driver.find_element_by_xpath('//*[@id="coiPage-1"]/div[2]/div[1]/button[1]')
click.click()

time.sleep(1)

while true:

    if(driver.find_elements_by_xpath('//*[@id="siteContainer"]/div[6]/div/div[3]/div[1]/div[2]/div/div/div[2]/div[2]/div[3]/div[2]/form/button'))
   element.click()
   break
else:
   driver.refresh()
continue

【问题讨论】:

  • 什么是 element.click()?同时修复标识。

标签: python selenium bots refresh element


【解决方案1】:

presence_of_element_located() 是检查页面 DOM 上是否存在元素的期望。这并不一定意味着该元素是可见的或可点击/可交互的。

理想情况下,在您需要的元素上调用click(),您需要为element_to_be_clickable() 诱导WebDriverWait,这是检查元素是否可见并启用的期望,以便您可以按如下方式单击它:

while True:
    try:
        element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//*[@id="siteContainer"]/div[6]/div/div[3]/div[1]/div[2]/div/div/div[2]/div[2]/div[3]/div[2]/form/button")))
        element.click()
        break
    except TimeoutException:
        driver.refresh()
        continue
    

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

【讨论】:

    【解决方案2】:

    我不是专家,但我会尽力帮助您。 首先,您的缩进似乎是错误的,并且您在 if 条件后忘记了冒号。 您的True 需要以大写字母开头才能被识别为布尔值,并且您应该使用try 语句而不是if

    而且,您不能在 WebElement 列表上单击()。你需要找到 ONE 元素,使用find_element,而不是find_elements

    如果你从selenium.common.exceptions导入TimeoutException,你可以用它来判断一个元素是否存在。

    while True:
        try:
            element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH'//*[@id="siteContainer"]/div[6]/div/div[3]/div[1]/div[2]/div/div/div[2]/div[2]/div[3]/div[2]/form/button')))
            element.click()
            break
        except TimeoutException:
            driver.refresh()
            continue
    

    【讨论】:

    • 为什么try ... exceptif 更好? if 会不起作用还是会变慢?
    • 因为 Selenium 为我们提供了捕获确切异常的工具,那么为什么不使用它们呢?您应该在每个find_element 上使用try ... except,因此您可以pass 并在元素不存在时打印日志。它可以与if 一起使用,但try ... except 在这种情况下更漂亮。
    • Ty Cyanox,你的答案有效,现在机器人刷新直到元素可见,但它不会点击所需的元素:}
    • 日志是怎么说的?
    • 如果您的元素此时不可点击,您可以使用driver.execute_script("arguments[0].click();", element) 而不是element.click()
    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多