使用頁面對象寶石和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