什么是setElementConverter以及它在Selenium WebDriver中的工作原理?

时间:2014-06-04 05:53:33

标签: java selenium-webdriver

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

查看此url

上面的参考文献中有注意

Should you wish to head down this route, the simplest hook point is to call setElementConverter

setElementConverter使用了什么或如何?谷歌搜索了一下,无法找到所提到的方法的实际实现。

2 个答案:

答案 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的示例之一在QAFExtendedWebDriverQAF中,其中QAF扩展了webdriver和webelement使其具有诸如listeners之类的附加功能,内置assertion, verificationwaitself-descriptive locator等。