如何在 Python 中使用 Selenium 设置动态显式等待?

How can I set a dynamic explicit wait using Selenium in Python?

我几天前构建的程序在这里遇到了一个小问题,所以我将非常简单地解释它:

我正在用我的程序从一个页面抓取数据,为此,我设置了显式等待:

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH,'/this_is_the_XPATH')))

在大多数情况下,它工作得很好,但是,有时上面的显式等待会导致此错误:

TimeoutException

这让我的程序停止,不得不再次重复一个漫长的过程。

我意识到设置为 10 秒的等待参数并不总是一个好的,所以我想从你们那里知道是否有办法将此参数设置为一个始终获得准确值的变量完全加载页面的加载时间(以秒为单位)。

其他更简单的想法可以是强制重复该过程直到元素的可见性最终加载,比如使用 try 和异常块,但我不知道我应该在异常块中键入什么才能一遍又一遍地重复尝试直到完成。

一如既往,感谢您的反馈,感谢您提前阅读。

始终为重复操作编写可重用函数,并为这些函数编写 exception-handling

您的代码:

 WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH,'elementTxt')))

创建可重复使用的函数:

def clickElement(elementTxt, driver, time) 
    try :

      element = WebDriverWait(driver, time).until(EC.visibility_of_element_located((By.XPATH,'/this_is_the_XPATH')))
      element.click()

     except ElementClickInterceptedException as e: 
        driver.execute_script ("arguments[0].click();",element)

     except TimeoutException as te
     element = WebDriverWait(driver, time).until(EC.element_to_be_clickable((By.XPATH,'/this_is_the_XPATH')))
     element.click()
    

调用函数:现在,您可以在任何需要执行click操作的地方调用这个clickElement函数。您需要传递 xPath 值、驱动程序实例时间(以秒为单位)

clickElement(xPathText, driver, 30)

Other more simple idea could be to repeat the process forcibly until the visibility of element is finally loaded

如果我们知道元素将不可见,那么我们不应该等到它显示。它导致代码停留在无限循环中,但您可以再次搜索元素。如果您看到上面的示例,在 TimeoutException 块中,如果仍然无法访问元素,我们将再次搜索相同的元素,那么我们需要考虑其他方法。

您正在使用 Selenium 的预期条件函数。 最初的 10 秒等待只是设置允许等待的最长时间,如果预期条件函数无法获得任何东西。

如果一直失败,您可能需要增加 10 秒的最长等待时间。

如果满足预期条件,等待将提前结束(即不是 10 秒)。

因此,重要的部分是确保 EC 功能按预期工作。我喜欢使用 element_to_be_clickable 而不是你的 visibility_of_element_located,或许可以尝试一下,(或其他人,完整的条件列表 here

试试这个:

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 20) #set a max wait time
element = wait.until(EC.element_to_be_clickable((By.XPATH, 'some xpath'))) #set the dynamic wait, which should end the wait early (ie not 20 seconds)