我正在尝试运行一个测试,我在其中列出了要在Web应用程序中搜索的ID列表,并检查是否为每个应用程序设置了属性。我将搜索结果建模为一个页面,但每次我加载一个新的搜索结果时,第一个结果似乎都被缓存,我最终得到一个陈旧的元素引用异常。如何为每个搜索到的id实例化一个新的SearchResult页面对象?
答案 0 :(得分:1)
Geb中没有对页面进行缓存的概念。页面内容元素可以缓存,但默认情况下不会缓存它们。即使事情没有被缓存,你可能仍然会得到StaleElementReferenceException
,例如当与DOM元素进行交互时会被删除,我怀疑这就是你的情况。
如果您的页面是动态的,即在页面上执行操作后以异步方式修改DOM,则应确保在与内容交互之前等待页面稳定。并且无需直接使用WebDriver API来实现它。
如果您分享了您的网页类的代码和您正在获得的堆栈跟踪,我将能够为您提供更好的指导。
答案 1 :(得分:-1)
在您的问题中,您已经提到Geb是否使用Page Objects缓存。但你没有提到你是否使用Page Factory。或许可以提到StaleElementReferenceException,或许你是。
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 属性。