使用页面对象宝石和webdriver的的Watir,我们偶尔碰到硒:: webdriver的::错误:: StaleElementReferenceError加载一些基本的东西,一个Ajax请求的页面上,并与更多的重新填充信息(对于页面速度的错觉)。陈旧元素参考错误
这是因为将有一个HTML元素存在,它迅速消失,之前用户是真正意识到它再次重现。
我们使用页面对象的“.when_present”方法要等到对象在页面上的访问之前的第一次。然而,即使在代码找到元素后,通常它会得到陈旧的元素错误,因为原始的HTML元素消失了,而另一个元素在尝试访问它时再次出现。
我们发现了一种使用Watir(而不是页面对象)的方法。我们基本上捕获了Watir :: Wait.until块中的StaleElementReferenceError。如果它得到一个异常,块返回false,并且Wait.until再次尝试,直到它变为true或最终超时。我们发现,这通常是第一次(下面的第3行)得到陈旧元素,从救援中返回false,Wait.until再次执行该块,第2次它是真的,测试继续并通过。
1 Watir::Wait.until {
2 begin
3 tds = page.my_element.when_present.element.tds
4 table_data_classes = tds.map{|cell| cell.attribute_value("class") }
5
6 # Should have at least one with a class of "xyz"
7 xyz = table_data_classes.select{|data| data.include?("xyz")}
8 xyz.size > 0
9 rescue Selenium::WebDriver::Error::StaleElementReferenceError
10 false
11 end
12 }
我真的只是想知道如果有对这种事情任何页面对象包装的。我找不到任何东西。如果没有,那没关系,因为上述工作。只是好奇。
谢谢
我们使用的是watir-webdriver 0.6.3。 – Gayle 2013-05-13 15:25:09
上面的代码是在页面的上下文中,所以我们肯定可以使用wait_until而不是Watir :: Wait.until。有点清洁,读得更好。我完全错过了那个存在。谢谢! – Gayle 2013-05-13 15:26:21