2017-12-26 18 views
2

이전 웹 사이트를 자동화하기 위해 Selenium WebDriver와 FirefoxDriver를 사용하고 있습니다. 웹 사이트는 일반 자바 스크립트를 사용하여 작성되었습니다. Ajax 요청을 수행하기 위해 XMLHttpRequest을 사용하고 있습니다. Ajax 요청이 완료되기를 기다려야하는 WaitForAjax() 함수를 작성하고 싶습니다. 현재, Explicit Wait (Thread.Sleep)을 사용하여이를 수행하고 있습니다. Implicit Wait을 사용하여 동일한 작업을 수행 할 수있는 사람이 있습니까?XMLHttpRequest 기반 요청에 대해 selenium 응답을 기다리는 방법

protected void WaitForAjax() { 
    /* 
    while (true) { 
     var ajaxIsComplete = (bool)(_driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"); 
     if (ajaxIsComplete) 
      break; 
    } 
    */ 

    //I am using Explicit Waits of 3 second. 
    Thread.Sleep(TimeSpan.FromSeconds(3)); 
} 
+0

https://stackoverflow.com/questions/15122864/selenium-wait-until-document-is-ready : 그리고 대부분의 경우,이 같은 스크립트를 시도 할 수 있습니다 : 할 수있는 뭔가가있다 웹 페이지 –

답변

0

나는 jQuery 준비 상태를 확인하고 있다고 생각합니다. jQuery의 일부가 아닌 다른 JavaScript AJAX 호출을 처리하려면 문서 준비 상태를 확인해야합니다. 다음과 같이 시도하십시오.

public void WaitForAjax() 
{ 
    while (true) 
    { 
     var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return document.readyState"); 
     if (ajaxIsComplete) 
      break; 
     Thread.Sleep(100); 
    } 
} 

이것은 명시 적 대기이며 셀렌 드라이버에서 예상되는 조건이 필요하지 않습니다.

+0

(문자열) (_ 드라이버를 IJavaScriptExecutor로 준비) 상태를 확인하려고 할 수 있습니다 .ExecuteScript ("return document.readyState"); 'complete'를 retire하고 문서의 로딩 상태를 확인하는 데 사용됩니다. –

+0

@BinnyChanchal 예상되는 AJAX 호출 후에이 함수를 호출하는 코드를 게시하십시오. –

0

아무 것도하지 않는 한 Thread.sleep()을 사용하지 마십시오.

public void waitForAjax() { 
    ExpectedCondition<Boolean> pageLoadCondition = driver -> "complete".equals(((JavascriptExecutor) driver).executeScript("return document.readyState")); 
    WebDriverWait wait = new WebDriverWait(webDriver, 30); 
    wait.until(pageLoadCondition); 
} 
+0

이미 자동화하고있는 웹 사이트가 jQuery를 사용하지 않는다고 언급했기 때문에. XMLHttpRequest를 사용하여 아약스 요청을 보냅니다. –

+0

죄송합니다. 그 방법을 수정했습니다. 나는 그런데 자바를 사용하고 있는데, 당신이 C#을 요청했다는 것을 알았지 만 그 아이디어는 같다. 명시 적으로 "document.readyState"의 예상 조건을 기다리십시오 –

+0

답장을 보내 주셔서 감사합니다. 귀하의 솔루션을 점검했지만 document.readyState가 Ajax 요청 완료를 보장하지 않습니다. MDN 문서 (https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState)에 따라 document.readyState == '문서 및 모든 하위 리소스의로드가 완료되었습니다'. PageLoad를 확인하는 것이 좋습니다. 이 대답 ( https://stackoverflow.com/a/15136386/7875155)에 따르면 Ajax를 확인하는 일반적인 방법은 없습니다. –