【问题标题】:Show more using Selenium requires sleep使用 Selenium 显示更多内容需要睡眠
【发布时间】:2021-02-27 20:28:52
【问题描述】:

所以我的代码正在运行,但我不明白为什么,这让我很恼火。

def load_more():
  while True:
    try:
      WebDriverWait(driver, 20, ignored_exceptions = (StaleElementReferenceException)).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".more"))).click()
      time.sleep(1)
    except TimeoutException:
      return

上面的功能是在我加载初始页面后使用的,点击“显示更多”按钮,直到它不再存在。

我的挫败在于使用time.sleep(1)。如果我删除它,代码会在随机点抛出StaleElementReferenceException。即使它在ignored_exceptions 中列出。

我的问题是。为什么代码需要使用sleep()函数?

【问题讨论】:

  • ,ignored_exceptions = (StaleElementReferenceException) 删除这一行,
  • @PDHide 这个问题的答案如何?
  • 请添加更多上下文行什么网站,你想做什么等。 staleelement 表示参考在被识别后发生了变化
  • 如果在 webdriverwait 返回元素后找到元素并且引用更改,则添加忽略的异常无济于事,
  • 如果页面中发生任何异步操作,也会发生staelement

标签: python python-3.x selenium selenium-webdriver


【解决方案1】:

https://www.selenium.dev/exceptions/

https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/StaleElementReference

当一个元素不再附加到 DOM 时,即它已被 从文档中删除或文档已更改,据说 过时了

因此,如果在 webdriverwait 返回元素后找到元素并且引用更改,则添加忽略的异常无济于事

当你给 time.sleep() 时,你正在等待后台进程完成。所以你必须识别仍在加载的背景元素并等待它完成

一个示例场景是:

A notification dialog that appears and dissappears in 3 second while you are checking for something else

您的代码流可能是这样的:

 click something 
 do something else without thinking about the notification

但它应该是这样的:

 click something
 wait for notification
 wait for notification to be removed
 do something

【讨论】:

  • 这说明了。是否有一种简单的方法来确定哪个元素仍在使用例如浏览器加载?我假设我应该等待页面加载的最后一个元素。
  • 是的,确保在发现元素后文档不会被修改
  • 除非我知道什么网站以及您要做什么,否则很难说出它会是什么。您可以尝试添加 DOM 断点并查看 DOM 是如何构建的
  • 是的。我应该学会自己做这件事,因为我可能需要为多个网站弄清楚。
  • @RuudVerhoef stackoverflow.com/a/65997614/6793637 看这个例子
猜你喜欢
  • 2013-11-10
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
相关资源
最近更新 更多