2013-04-10 86 views
4

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

我真的只是想知道如果有對這種事情任何頁面對象包裝的。我找不到任何東西。如果沒有,那沒關係,因爲上述工作。只是好奇。

謝謝

回答

2

蓋爾,很好的問題。此時,如果StaleElementReferenceError發生在頁面對象gem中,則沒有特定的重試處理。我從另一個人那裏聽說他們定期得到這個錯誤,這是我可以研究的東西。你使用的是什麼版本的watir-webdriver?

有一種方法可以使用頁面對象複製上面的代碼。我不確定您提供的上述代碼是否位於您的頁面內,或者是否位於其他位置(如步驟定義或其他位置)。這裏是我會做什麼用的頁面對象寶石:

內,您的PageObject類

def has_element_with_class(clz) 
    wait_until 
    begin 
     cells = my_element.when_present.cell_elements 
     cells.any? { |cell| cell.attribute('class').include? clz } 
    rescue Selenium::WebDriver::Error::StaleElementReferenceError 
     false 
    end 
end 

我只是讓所有嵌套在my_element到一個數組細胞(TDS)的。我在該數組上調用any?方法,如果任何塊返回true,則返回true,否則返回false。這與上面所有的代碼具有相同的效果。如果發生錯誤,那麼您將繼續另一次。

+0

我們使用的是watir-webdriver 0.6.3。 – Gayle 2013-05-13 15:25:09

+0

上面的代碼是在頁面的上下文中,所以我們肯定可以使用wait_until而不是Watir :: Wait.until。有點清潔,讀得更好。我完全錯過了那個存在。謝謝! – Gayle 2013-05-13 15:26:21

相關問題