我在查找刷新页面的元素时遇到问题。现在尝试在元素上执行任何操作,并在消息StaleElementReferenceException
下方抛出Element is no longer valid
查找此url
在上述引用网址上有一个注释关于:Should you wish to head down this route, the simplest hook point is to call setElementConverter
setElementConverter
使用什么或如何使用?谷歌了一下,找不到提到的方法的实际实现。
最佳答案
我认为您关注setElementConverter
可能会走错路。正如documentation page you linked所建议的那样,如果元素过时,则应仅尝试再次查找该元素。
我认为,如果您是Selenium的初学者,则应遵循此建议并在此处停止。 try catch 过时的元素异常,然后再次查找该元素,而不必担心setElementConverter
。
如果您正在研究Selenium的更高级行为,或者在满足您对setElementConverter
的好奇心时陷入僵局,那么以下几行将更为重要。
该文档说,您可以尝试编写一些巧妙的以便自动重复查找该元素,但这会导致脆弱和竞争状况。我认为实际上没有人尝试通过这种方式克服StaleElementExceptions,因为它既复杂又脆弱,而最简单的解决方案是在自己的代码中重新找到该元素。
正如@SantiBailors在他的评论中指出的那样,setElementConverter是protected
中的RemoteWebDriver
方法。
看起来您将扩展RemoteWebDriver并将其他行为注入(inject)setElementConverter的“挂钩”中,或者提供自己的
JsonToWebElementConverter
来更改该行为以自动重试或处理过时的元素。我不确定你会怎么做。这就是我的知识的结尾,而且我从未听说有人接受过此建议以加入
setElementConverter
。再一次,我想重申一下,这可能不是您想要执行的操作,并且很可能您只是想在自己的代码中再次找到该元素,而使用try-捕获StaleElementException
并在ThreadSleep或WebDriverWait之后重试。