2013-04-10 3 views
4

페이지 개체 젬과 Watir 웹 드라이버를 사용하여 일부 기본 내용을로드하고 Ajax 요청을 작성하고 더 많은 페이지를 다시 채우는 페이지에서 Selenium :: WebDriver :: Error :: StaleElementReferenceError를 종종 접하게됩니다 info (페이지의 속도에 대한 환상).부실 요소 참조 오류

이 오류는 HTML 요소가 있기 때문에 발생합니다. 사용자가 실제로이를 인식하기 전에 다시 사라지고 다시 나타납니다.

우리는 페이지 객체의 ".when_present"메소드를 사용하여 객체에 액세스하기 전에 객체가 페이지에 처음 나타날 때까지 기다립니다. 그러나 코드가 요소를 찾은 후에도 원본 HTML 요소가 사라지고 다른 HTML 요소가 액세스하려고 할 때 다른 요소가 다시 나타나기 때문에 일반적으로 요소 오류가 발생합니다.

이 문제를 해결하기 위해 Watir (페이지 객체가 아님)을 사용하는 방법을 발견했습니다. 기본적으로 Watir :: Wait.unil 블록 내부의 StaleElementReferenceError를 잡아냅니다. 예외가 발생하면 블록은 false를 반환하고 Wait.until은 다시 true가되거나 결국 시간이 초과 될 때까지 다시 시도합니다. 우리가 발견 한 것은 대개 Stale Element를 처음으로 얻었고 (아래 3 행), 구조에서 거짓을 반환합니다. Wait.unil은 블록을 다시 실행하고 두 번째로 true가되고 테스트가 진행되고 통과합니다 .

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가 page-object gem에서 발생하면 재시도에 대한 특별한 처리는 없습니다. 나는 그들이 다른 사람으로부터 주기적으로이 오류를 발견하고 내가 조사 할 수있는 것이라고 들었습니다. watir-webdriver의 어떤 버전을 사용하고 있습니까?

page-object를 사용하여 위에서 작성한 코드를 복제하는 방법이 있습니다. 위의 코드가 귀하의 페이지 내부에 있거나 다른 곳 (예 : 단계 정의 또는 다른 장소)에 있는지 확실하지 않습니다. 여기에 내가 페이지 객체 보석을 사용 할 것이다 무엇 : 당신의 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)의 모든 무엇입니까의 내부

. 해당 블록에 true가 반환되고 false이면 false를 반환하는 배열에 any? 메서드를 호출합니다. 이것은 위에있는 모든 코드와 동일한 효과를냅니다. 오류가 발생하면 다른 시간을 계속합니다.

+0

우리는 watir-webdriver 0.6.3을 사용하고 있습니다. – Gayle

+0

위의 코드는 페이지 컨텍스트에 있으므로 Watir :: Wait.until 대신 wait_until을 사용할 수 있습니다. 조금 깔끔하고 읽기가 쉽습니다. 나는 그것이 존재한다는 것을 완전히 놓쳤다. 감사! – Gayle

관련 문제