2010-02-03 4 views
5

우리는 우리의 응용 프로그램에서 WebDriver라고 불리는 Selenium2.0으로 Webrat을 실행하고 있습니다.WebRat + Selenium WebDriver : ajax가 완료 될 때까지 기다림

WebDriver는 페이지 다시로드를 매우 잘 처리하며 브라우저가 전체 페이지를 다시로드하는 경우 다음 단계를 시작하지 않습니다. 문제는이 메커니즘이 Ajax 요청과 작동하지 않는다는 것입니다. click() 또는 change() 후에 WebDriver가 유휴 상태가되지 않습니다.

누구든지 페이지에서 모든 아약스 요청이 끝날 때까지 웹 드라이브를 유휴 상태로 만드는 방법을 제안 할 수 있습니까?

답변

3

우리는 선택적 루프에서 호출을 래핑하여이 시나리오를 처리하는 셀레늄 위에 레이어를 작성했습니다. 그래서 당신은 할 줄 때 그것이 AutomatedTester 위에서 제안한 것과 유사한 일을 할 것

@browser.click "#my_button_id" 

:

class Browser 
    def click(locator) 
    wait_for_element(locator, :timeout => PAGE_EVENT_TIMEOUT) 
    @selenium.click(locator) 
    end 

    def wait_for_element(locator, options) 
    timeout = options[:timeout] || PAGE_LOAD_TIMEOUT 
    selenium_locator = locator.clone 
    expression = <<EOF 
     var element; 
     try { 
     element = selenium.browserbot.findElement('#{selenium_locator}'); 
     } catch(e) { 
     element = null; 
     }; 
     element != null; 
EOF 
    begin 
     selenium.wait_for_condition(expression, timeout) 
    rescue ::Selenium::SeleniumException 
     raise "Couldn't find element with locator '#{locator}' on the page: #{$!}.\nThe locator passed to selenium was '#{selenium_locator}'" 
    end 
    end 
end 

래퍼 또한 버튼/입력 라벨 등으로 검색 할 수 있도록 같은 다른 일을했다 (래퍼가 타이밍 문제를 해결할 수있을뿐만 아니라 우리가 거기에 넣은 것 중 하나 일뿐입니다.)

1

실례합니다. 루비를 실례합니다.하지만해야 할 일은 객체를 찾아서 그 객체가 없을 때까지 기다리는 것입니다. 무엇 아래의 코드가해야 할 것은 운전자가 ID idOfElement를 가진 요소를 찾을 수 있다면 다음 그것이 오류

assert !60.times{ break if (driver.find_element(:id, "idOfElement) rescue false); sleep 1 } 
+0

예, 작동하지만 각 Ajax 요청에서 기다리고있는 것을 지정해야합니다 . 나는 더 좋은 방법이 있어야한다고 생각합니다. –

0

에게 별도의 MTD를 던져해야 할 수 있는지 확인하기 위해 노력하고 잠시 루프마다 초를 기다려 (래퍼) 기다려야 요소를 확인하는 데 도움이됩니다.

관련 문제