2009-09-22 3 views
2

Selenium에서 Open ("[some URL]") 메서드를 호출하면 모든 리소스 (이미지, CSS, JS)가 다운로드 될 때까지 대기합니다. 그러나 브라우저가 자원 요청을 완료했다는 것을 어떻게 알 수 있습니까?Selenium의 Open 함수는 무엇까지 대기합니까?

DefaultSelenium selenium = new DefaultSelenium(
    "localhost", 4444, "*iexplore", "http://www.stackoverflow.com"); 

// open my profile page 
selenium.Open("http://stackoverflow.com/users/111934/jeff-meatball-yang"); 

위의 URL은, 예를 들면 :

여기 (C#에서) 드라이버 코드의 내 조각입니다. 내가 setTimeout()onload 이벤트 처리기에서 트리거 된 매우 긴 지연에 래핑 된 AJAX 호출이있는 경우 계속하기 전에 Selenium은 실제로 AJAX 호출을 기다리지 않습니다 ... 수동으로 Selenium을 사용하여 기다려야합니다. WaitForPageToLoad(timeout).

그렇다면 Selenium은 일반 페이지 (AJAX 제외)로드가 완료되면 어떻게 감지합니까?

답변

2

나는 location.href가 사용 가능할 때까지 기다릴 것으로 믿습니다. 즉,이 지점 이후에 AJAX를 실행하는 경우 waitForCondition을 사용해야합니다.

selenium.open("http://www.example.com/"); 
selenium.waitForCondition("var value = selenium.getText('id=pageLoadStatus'); value == 'Loaded'", "60000"); 

아래 셀레늄 코어에서 현재 페이지로드 감지 코드 :

this.recordPageLoad = function(elementOrWindow) { 
    LOG.debug("Page load detected"); 
    try { 
     if (elementOrWindow.location && elementOrWindow.location.href) { 
      LOG.debug("Page load location=" + elementOrWindow.location.href); 
     } else if (elementOrWindow.contentWindow && elementOrWindow.contentWindow.location && elementOrWindow.contentWindow.location.href) { 
      LOG.debug("Page load location=" + elementOrWindow.contentWindow.location.href); 
     } else { 
      LOG.debug("Page load location unknown, current window location=" + this.getCurrentWindow(true).location); 
     } 
    } catch (e) { 
     LOG.error("Caught an exception attempting to log location; this should get noticed soon!"); 
     LOG.exception(e); 
     self.pageLoadError = e; 
     return; 
    } 
    self.newPageLoaded = true; 
}; 
+0

감사합니다. Commander Dave. :) 당신이 이것을 발견 한 파일이나 SVN 주소로 나를 가리킬 수 있습니까? –

+0

여러분을 환영합니다! http://code.google.com/p/selenium/source/browse/selenium-core/trunk/src/main/resources/core/scripts/selenium-browserbot.js#83 –

+0

['waitForElementPresent'를 사용할 수도 있습니다. ] (http://release.seleniumhq.org/selenium-core/1.0.1/reference.html#storeElementPresent)를 호출 한 후 'open'을 호출하십시오. – ma11hew28

1

@ 데이브 헌트, you're correct that recordPageLoad is called는하지만, 단지 가능한 경우 페이지로드 위치 (location.href)를 기록하고 self.newPageLoaded = true을 설정하고, 값은 isNewPageLoaded에 의해 반환되고, 따라서 doOpen에 의해 반환됩니다.

isNewPageLoaded_isNewPageLoaded < = makePageLoadCondition < = doOpenselenium-api.js에 의해 호출된다. 그리고 doOpen은 Selenium IDE가 open 명령을 실행 한 후에 호출됩니다.

관련 추적이다

doOpen 호출 (selenium-browserbot.js 이동) openLocation =>getCurrentWindow =>_modifyWindow => 위의 주석에 의하면, 연속적으로 문서가 변경 될 때까지 폴링 "대기하고있다 modifySeparateTestWindowToDetectPageLoads (을로드했습니다. ") =>pollForLoad =>getReadyState입니다. 페이지가 완전히, 이미지 및 모든로드 될 때까지

getReadyState, 즉 rs == 'complete', 때까지 document.readyState (rs), 및 pollForLoad 대기를 반환합니다.

Ace Ventura은 내가 할 수있는 것보다 더 잘 설명합니다.


P. @Dave Hunt, Selenium IDE Flow Control script on GitHub에 감사드립니다. 그것은 편리하게 들어왔다! :)

관련 문제