我在查找刷新页面的元素时遇到问题。现在尝试在元素上执行任何操作,并在消息StaleElementReferenceException下方抛出Element is no longer valid
查找此url

在上述引用网址上有一个注释关于:
Should you wish to head down this route, the simplest hook point is to call setElementConvertersetElementConverter使用什么或如何使用?谷歌了一下,找不到提到的方法的实际实现。

最佳答案

我认为您关注setElementConverter可能会走错路。正如documentation page you linked所建议的那样,如果元素过时,则应仅尝试再次查找该元素。



我认为,如果您是Selenium的初学者,则应遵循此建议并在此处停止。 try catch 过时的元素异常,然后再次查找该元素,而不必担心setElementConverter

如果您正在研究Selenium的更高级行为,或者在满足您对setElementConverter的好奇心时陷入僵局,那么以下几行将更为重要。



该文档说,您可以尝试编写一些巧妙的以便自动重复查找该元素,但这会导致脆弱和竞争状况。我认为实际上没有人尝试通过这种方式克服StaleElementExceptions,因为它既复杂又脆弱,而最简单的解决方案是在自己的代码中重新找到该元素。

正如@SantiBailors在他的评论中指出的那样,setElementConverter是protected中的RemoteWebDriver方法。

  • Selenium API Documentation for RemoteWebDriver setElementConverter
  • Selenium source code on GitHub for RemoteWebDriver setElementConverter
  • JsonToWebElementConverter Class in the source code

  • 看起来您将扩展RemoteWebDriver并将其他行为注入(inject)setElementConverter的“挂钩”中,或者提供自己的JsonToWebElementConverter来更改该行为以自动重试或处理过时的元素。

    我不确定你会怎么做。这就是我的知识的结尾,而且我从未听说有人接受过此建议以加入setElementConverter。再一次,我想重申一下,这可能不是您想要执行的操作,并且很可能您只是想在自己的代码中再次找到该元素,而使用try-捕获StaleElementException并在ThreadSleep或WebDriverWait之后重试。

    07-27 13:36