我对PageFactory中@CacheLookUp的概念不是很清楚。我在我的框架中为每个元素使用它,但很多时候它会导致selenium中的Stale Exception。在删除@Cache注释时,它开始正常工作。
请解释@CacheLookUp的内部工作机制,以便我开始很好地使用它,无论何时需要它。
答案 0 :(得分:1)
可能有用的额外信息 当PageFactory初始化一个用@FindBy或@FindAll注释修饰的WebElement时,它会创建一个Java代理对象。这样,PageFactory能够延迟加载元素,并且还能够在PageObject初始化期间避免在浏览器的WebDriver上调用FindElementBy。
就此而言,这意味着Proxy对象必须解析实际的WebElement以对WebElement进行所有必要的调用。逻辑上有两种方法可以做到这一点 1.每次需要时都找到元素(由于对WebDriver的FindElement REST调用,这很耗时) 2.或者将元素从第一个FindElement调用缓存到WebDriver并在后续调用中返回它。 (对于动态元素来说,这不是一个好主意,在DOM的生命周期中会刷新多次,因为引用较旧的缓存版本会导致State Element异常。
为了迎合这两种寻找元素的方法,来自Selenium Dev团队的聪明人创建了@CacheLookUp注释。如果您使用此注释,则可以指示Selenium不会每次都对Browser的WebDriver进行FindElement调用。
我最近写了一篇关于@CacheLookup的性能优势的文章。您可以在ToolsQA - @CacheLookup
上阅读它还会建议何时使用@CacheLookup以及何时不使用它。
如果要调试代码以了解工作原理,那么您必须查看这两个关键接口。 1. org.openqa.selenium.support.pagefactory.ElementLocatorFactory:这有助于PageFactory获取ElementLocator。 2.第二个接口是org.openqa.selenium.support.pagefactory.ElementLocator。具体实现是DefaultElementLocator。
要开始调试,您可以进入PageFactory.initElement,这将引导您通过这两个接口实现DefaultElementLocator。您可以在此处找到缓存逻辑。