我在查找页面刷新的元素时遇到问题。现在尝试对StaleElementReferenceException
下面的元素执行任何操作,并显示消息Element is no longer valid
查看此url
上面的参考文献中有注意:
Should you wish to head down this route, the simplest hook point is to call setElementConverter
setElementConverter
使用了什么或如何?谷歌搜索了一下,无法找到所提到的方法的实际实现。
答案 0 :(得分:0)
我认为您可能专注于setElementConverter
,从而走错了路。正如documentation page you linked所建议的那样,如果元素过时,您只需尝试再次找到它。
如果该元素已替换为相同的元素,则一种有用的策略是再次查找该元素。
我认为,如果您是Selenium的初学者,则应遵循此建议并在此处停止。尝试捕获过时的元素异常,然后再次查找该元素,而不必担心setElementConverter
。
如果您正在研究Selenium的更高级行为,或者在满足您对setElementConverter
的好奇心时陷入僵局,那么以下几行将更为重要。
如果您自动执行此操作,请注意,您很可能会在比赛条件和潜在的脆弱感中打开测试。
...
如果您希望沿着这条路线前进,最简单的方法就是调用setElementConverter。
文档说,您可能尝试编写一些聪明的东西 ,以便自动重复查找元素,但这会导致脆弱和竞争状况。我认为实际上没有人尝试通过这种方式克服StaleElementExceptions,因为它既复杂又脆弱,最简单的解决方案是在您自己的代码中重新查找元素。
正如@SantiBailors在其评论中指出的那样,setElementConverter是protected
中的RemoteWebDriver
方法。
似乎您将扩展RemoteWebDriver并将其他行为注入setElementConverter的“挂钩”中,或提供自己的JsonToWebElementConverter
来更改该行为以自动重试或处理过时的元素。
我不确定您将如何执行此操作。这就是我的知识的结局,而且我从未听说有人接受过此建议以加入setElementConverter
。再一次,我想重申一下,这可能不是您想要执行的操作,很可能您只是想在自己的代码中再次找到该元素,而使用try-赶上StaleElementException
,然后在ThreadSleep或WebDriverWait之后再试一次。
答案 1 :(得分:0)
由于受保护,因此无法直接访问setElementConverter
的{{1}}方法。可以通过扩展webdriver来使用。
如何使用RemoteWebDriver
的示例之一在QAFExtendedWebDriver的QAF中,其中QAF扩展了webdriver和webelement使其具有诸如listeners之类的附加功能,内置assertion, verification,wait,self-descriptive locator等。