Selenium中PageFactory的@CacheLookUp工作

Selenium中PageFactory的@CacheLookUp工作,selenium,Selenium,我不太清楚PageFactory中@CacheLookUp的概念。我在我的框架中对每个元素都使用了它,但很多时候它会导致selenium中的陈旧异常。删除@Cache注释后,它开始正常工作 请解释一下@CacheLookUp的内部工作机制,以便我在需要它的地方很好地开始使用它。可能有用的额外信息 当PageFactory初始化用@FindBy或@FindAll注释修饰的WebElement时,它会创建一个Java代理对象。通过这种方式,PageFactory可以延迟加载元素,还可以避免在Page

我不太清楚PageFactory中@CacheLookUp的概念。我在我的框架中对每个元素都使用了它,但很多时候它会导致selenium中的陈旧异常。删除@Cache注释后,它开始正常工作

请解释一下@CacheLookUp的内部工作机制,以便我在需要它的地方很好地开始使用它。

可能有用的额外信息 当PageFactory初始化用@FindBy或@FindAll注释修饰的WebElement时,它会创建一个Java代理对象。通过这种方式,PageFactory可以延迟加载元素,还可以避免在PageObject初始化期间对浏览器的WebDriver调用FindElementBy

就这点而言,这意味着代理对象必须解析实际的WebElement才能对WebElement进行所有必要的调用。从逻辑上讲,有两种方法可以做到这一点 1.或者在每次需要时找到该元素(由于对WebDriver的FindElement REST调用,这非常耗时) 2.或者缓存对WebDriver的第一次FindElement调用中的元素,并在后续调用中返回它。(这对于动态的元素不是一个好主意,即在DOM的生命周期内多次刷新,因为引用较旧的缓存版本将导致状态元素异常

为了满足这两种查找元素的方法,Selenium开发团队的聪明人创建了@CacheLookUp注释。如果您使用此注释,您可以指示Selenium不要每次都对浏览器的WebDriver进行FindElement调用

我最近写了一篇关于@CacheLookup的性能优势的文章。你可以在

它还将建议何时使用@CacheLookup以及何时不使用它

如果您想调试代码以了解工作原理,那么必须查看这两个关键接口。 1.org.openqa.selenium.support.pagefactory.ElementLocatorFactory:这有助于pagefactory获取ElementLocator。 2.第二个接口是org.openqa.selenium.support.pagefactory.ElementLocator,具体实现是DefaultElementLocator


要开始调试,您可以进入PageFactory.initElement内部,这将引导您通过这两个接口实现。您可以在这里找到缓存逻辑。

此注释将缓存元素或元素列表,因此重复访问不会导致实际的findElement方法调用。如果您引用的元素发生任何DOM更改,则cachelookup将引发陈旧元素异常。在这些情况下,请不要使用此注释。请查找org.openqa.selenium.support.pagefactory.DefaultElementLocator的源代码。您看过文档了吗?它说了什么?您对什么感到困惑?我在这里没有看到太多的研究工作。