selenium python 如何在找到表后等待特定元素出现

0 投票
1 回答
21 浏览
提问于 2025-04-14 18:09

我在等待一个表格的表头出现。

headers = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='react-table']/thead/tr/th/span")))

这个表头是一个包含网页元素的Python列表。

但是,当我用一个变量h来遍历这个列表,并使用h.text时,出现了一个“过时元素引用”的错误。

我觉得我需要逐个等待这个列表中的元素出现。

有没有办法在我已经有这些网页元素的情况下,调用wait.until(EC.presence_of_element_located....)呢?

1 个回答

0

我觉得,除非你能明确选择等待表格的最后一行(也就是说,你需要提前知道最后一个表格是什么),否则简单来说,没什么好的办法。而即使这样,也不能阻止表格重新渲染。

如果出现了 StaleElementReferenceException 错误,那就意味着网页的 DOM(文档对象模型)重新渲染了表格,这种情况可能会根据网站的不同而发生。有时候甚至会发生几次。Selenium 曾经可以访问某个元素,但一旦这个元素被重新渲染,旧的元素就不存在了,必须重新选择新的元素(即使它们在视觉上看起来完全一样)。

解决这个问题有几种方法。一种是使用其他库,比如 Playwright(这个库的一个特点是表格重新渲染时不会抛出 StaleElementReferenceExceptions)。另一种是设置一个定时器,把延迟设置得足够高,以确保所有的重新渲染都完成(但这并不是最优的,因为有时候网站的速度比你预期的要慢)。还有一种方法是在循环中尝试你的代码 X 次,并加上一些延迟,使用 try except 来捕捉 StaleElementReferenceException(不过,这其实和之前的解决方案有同样的问题)。

总的来说,Playwright 是解决这个问题的好办法(除非你能接受因为延迟太短而偶尔出错),而我觉得 Selenium 在处理使用像 React 这样的 JavaScript 框架的页面时,没有一个好的模式,因为这些页面可能会多次重新渲染元素。

撰写回答