【问题标题】:Selenium sometimes throws TimeoutException with presence_of_element_located()Selenium 有时会使用 presence_of_element_located() 抛出 TimeoutException
【发布时间】:2020-12-14 20:54:50
【问题描述】:

我在 Python 3.6 中使用 Selenium,它工作正常,但并非总是如此。 我有这个代码:

 try:

    table = wait.until(
        EC.presence_of_element_located((
            By.XPATH,
            "/html/body/div/div[2]/div[1]/table/tbody/"
            "tr[2]/td/table/tbody/tr/td/div/table[2]"
        ))
    )
except TimeoutException:
    driver.quit()
    return {
        "statusCode": 500,
        "body": json.dumps({"error": "WebPage dont load"}),
        "headers": {
            "Content-Type": "application/json"
        }
    }

这是可行的,但有时会出现超时异常,我需要 100% 的时间使用它。我已经尝试过使用time.sleep(5)presence_of_all_elements_locatedvisibility_of_element_located,等待网页加载的功能,但问题没有解决。

我也有:

driver.implicitly_wait(20)

wait = WebDriverWait(driver, 30)

让等待变得隐式和显式。

【问题讨论】:

  • 不要混合显式和隐式等待。那可能是你的问题。此外,您基于路径的 XPATH 很脆弱……尝试找到一种更好的方法来获取您正在寻找的元素。 (在 DOM 更新期间路径可能会改变...)
  • 感谢您的评论,我将尝试仅使用显式等待。

标签: selenium selenium-webdriver webdriver python-3.6 webdriverwait


【解决方案1】:

确保问题不是错误,可能元素并不总是出现在页面上。如果是错误,请与开发人员讨论。

如果不是错误,请使用相对 XPath 而不是绝对 XPath,因为绝对 XPath 非常脆弱。或者更好的是,使用唯一的 ID 或类。 您可以找到有关 XPath 的更多信息here

【讨论】:

  • 我认为问题实际上出在页面上,我已经只使用显式等待并更改相对路径的 xpath,问题仍然存在。
【解决方案2】:

presence_of_element_located()

presence_of_element_located() 是检查页面 DOM 上是否存在元素的期望。这并不一定意味着该元素是可见的。因此它可能无法满足您的需求。


visibility_of_element_located()

visibility_of_element_located() 是检查元素是否存在于页面的 DOM 上并且可见的期望。可见性是指元素不仅显示出来,而且高度和宽度都大于0。


这个用例

因此,理想情况下,您需要将 presence_of_element_located() 替换为 visibility_of_element_located(),您的有效代码块将是:

try:

   table = wait.until(
       EC.visibility_of_element_located((
           By.XPATH,
           "/html/body/div/div[2]/div[1]/table/tbody/"
           "tr[2]/td/table/tbody/tr/td/div/table[2]"
       ))
   )

其他注意事项

与其使用 absolute xpath,不如使用 relative xpath。


参考文献

您可以在以下位置找到一些相关的详细讨论:

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 2022-01-16
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多