페이지 개체 젬과 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 }
이런 종류의 페이지 객체 래퍼가 있는지 궁금합니다. 나는 아무것도 찾을 수 없었다. 그렇지 않다면, 위의 작동 때문에 괜찮습니다. 그냥 궁금해서.
감사합니다.
우리는 watir-webdriver 0.6.3을 사용하고 있습니다. – Gayle
위의 코드는 페이지 컨텍스트에 있으므로 Watir :: Wait.until 대신 wait_until을 사용할 수 있습니다. 조금 깔끔하고 읽기가 쉽습니다. 나는 그것이 존재한다는 것을 완전히 놓쳤다. 감사! – Gayle