Geb是否缓存页面对象

时间:2018-03-07 23:09:46

标签: selenium-webdriver geb

我正在尝试运行一个测试,我在其中列出了要在Web应用程序中搜索的ID列表,并检查是否为每个应用程序设置了属性。我将搜索结果建模为一个页面,但每次我加载一个新的搜索结果时,第一个结果似乎都被缓存,我最终得到一个陈旧的元素引用异常。如何为每个搜索到的id实例化一个新的SearchResult页面对象?

2 个答案:

答案 0 :(得分:1)

Geb中没有对页面进行缓存的概念。页面内容元素可以缓存,但默认情况下不会缓存它们。即使事情没有被缓存,你可能仍然会得到StaleElementReferenceException,例如当与DOM元素进行交互时会被删除,我怀疑这就是你的情况。

如果您的页面是动态的,即在页面上执行操作后以异步方式修改DOM,则应确保在与内容交互之前等待页面稳定。并且无需直接使用WebDriver API来实现它。

如果您分享了您的网页类的代码和您正在获得的堆栈跟踪,我将能够为您提供更好的指导。

答案 1 :(得分:-1)

在您的问题中,您已经提到Geb是否使用Page Objects缓存。但你没有提到你是否使用Page Factory。或许可以提到StaleElementReferenceException,或许你是。

PageFactory CacheLookup

PageFactory确实提供了CacheLookup属性来缓存 WebElements 。此属性可帮助脚本指示PageFactory.initElements(driver, page.class)方法在找到元素后对其进行缓存。一个例子:

LoginPageNew login_page = PageFactory.initElements(driver, LoginPageNew.class);

现在,在 PageObjects 中,如果任何属性标有@CacheLookup,则不会再次搜索,这对于总是存在的元素很有用(粗略的)对于基于JavaScript和AJAX的应用程序并不意味着。这意味着一旦搜索,页面的元素/元素将被缓存。一个例子:

@FindBy(id="user_login") 
@CacheLookup
WebElement username;

@FindBy(how=How.ID,using="user_pass") 
@CacheLookup
WebElement password;

@FindBy(how=How.XPATH,using=".//*[@id='wp-submit']") 
@CacheLookup
WebElement submit_button;

因此, Geb 是否使用页面对象的缓存取决于框架的配置方式以及是否实现 CacheLookup 属性。