2010-03-03 4 views
8

Ajax 웹 응용 프로그램을 테스트하기 위해 WatiN 테스트를 작성 중이며 Ajax 요청의 타이밍 문제가 발생했습니다.WatiN에서 jQuery Ajax 요청을 완료 할 때까지 기다리는 방법은 무엇입니까?

페이지의 작업에 의해 Ajax 요청이 트리거 된 후 페이지가 올바르게 업데이트되었는지 확인하기 전에 요청이 완료 될 때까지 기다려야합니다.

JavaScript 핸들러를 등록하여 $.ajaxStart$.ajaxComplete에 대한 처리기를 등록하여 요청 진행 여부를 추적하는 것이 해결책이라고 생각합니다. 나는 곧 그것을 파헤쳐 보일 것이지만, 다른 누군가가 이미 이것을 해결했는지 알고 싶다. Ajax 테스트의 일반적인 문제인 것처럼 보입니다.

답변

18

이 문제를 해결하기 위해 몇 가지 WatiN Browser 확장 방법을 만들었지 만 여전히 다른 솔루션에 관심이 있습니다.

InjectAjaxMonitor 메소드는 진행중인 요청의 수를 추적하기 위해 ajaxStart 및 ajaxComplete 이벤트에 첨부하는 javascript 전역 변수를 작성합니다.

계속 진행하기 전에 AJAX 요청이 완료 될 때까지 기다릴 필요가있을 때마다 browserInstance.WaitForAjaxRequest();으로 전화 할 수 있습니다. .ajaxStart이 첫 번째 Ajax 요청에 대한 호출되기 때문에 .ajaxComplete는 아약스 요청이 완료 때마다 호출되는 동안


public static class BrowserExtensions 
{ 
    public static void WaitForAjaxRequest(this Browser browser) 
    { 
     int timeWaitedInMilliseconds = 0; 
     var maxWaitTimeInMilliseconds = Settings.WaitForCompleteTimeOut*1000; 

     while (browser.IsAjaxRequestInProgress() 
       && timeWaitedInMilliseconds < maxWaitTimeInMilliseconds) 
     { 
      Thread.Sleep(Settings.SleepTime); 
      timeWaitedInMilliseconds += Settings.SleepTime; 
     } 
    } 

    public static bool IsAjaxRequestInProgress(this Browser browser) 
    { 
     var evalResult = browser.Eval("watinAjaxMonitor.isRequestInProgress()"); 
     return evalResult == "true"; 
    } 

    public static void InjectAjaxMonitor(this Browser browser) 
    { 
     const string monitorScript = 
      @"function AjaxMonitor(){" 
      + "var ajaxRequestCount = 0;" 

      + "$(document).ajaxSend(function(){" 
      + " ajaxRequestCount++;" 
      + "});" 

      + "$(document).ajaxComplete(function(){" 
      + " ajaxRequestCount--;" 
      + "});" 

      + "this.isRequestInProgress = function(){" 
      + " return (ajaxRequestCount > 0);" 
      + "};" 
      + "}" 

      + "var watinAjaxMonitor = new AjaxMonitor();"; 

     browser.Eval(monitorScript); 
    } 
} 
+1

모니터가 자바 스크립트가 삽입되기 전에 하나 이상의 아약스 요청이 시작되지 않으면 (이 시점에서 카운터가 더 이상 정확하지 않은 경우)이 솔루션은 잘 작동합니다. WatiN의 프로세스 초기에 모니터를 삽입하는 방법을 모르겠습니다. 테스트를 실행할 때 jquery가 포함 된 직후 모니터를 조건부로 포함하는 것이 가장 좋은 방법 일 수 있습니다. –

+0

글로벌 Ajax 이벤트 핸들러를 애플리케이션의 마스터 페이지에 넣습니다. 또한 카운터 대신 세마 폰 비트 만 유지합니다. http://lebobitz.wordpress.com/2011/03/06/synchronizing-watin-and-ajax-with-jquery/ –

+2

코드에 문제가 하나 있습니다. 웹 사이트에 jQuery 지원이 없다 (필자의 경우) - 먼저 "삽입"할 수있다. "모니터 스크립트"앞에이 코드를 추가하기 만하면됩니다. const string jquerry = @ "var element1 = document.createElement ('script'); element1.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js'; element1.type = 'text/javascript'; document.getElementsByTagName ('head') [0] .appendChild (element1); "; browser.Eval (jquerry); @Alex comment와 관련하여 – Alex

6

이 솔루션은 매우 잘 작동하지 않습니다. 당신이 당신의 콘솔에서이 간단한 코드를 실행하는 경우 :

$.ajax({url:"/"}); $.ajax({url:"/"}) 

을하고 .ajaxStart.ajaxComplete 핸들러 방법의 일부 로깅을 추가, 당신은 .ajaxStart 핸들러가 한 번만 .ajaxComplete 핸들러를 두 번 호출되는 것을 볼 수 있습니다. 따라서 ajaxRequestCount은 부정적이되고 모든 디자인이 엉망이됩니다.

디자인을 유지하려면 대신 .ajaxSend을 사용하는 것이 좋습니다.

또 다른 해결책은 .ajaxStop 대신 .ajaxComplete을 사용하는 것입니다,하지만 그렇게함으로써, 당신은 ajaxRequestCount 필요하지 않습니다, 당신은 단지 장면 뒤에 실행 아약스 요청이있는 경우라고 부울이 필요합니다.

매우 유용한 정보를 찾을 수 있습니다 http://api.jquery.com/category/ajax/global-ajax-event-handlers/

희망이 도움이됩니다.

+0

.ajaxStart의 오용에 대한 좋은 호소. 그것은 내 솔루션의 버그입니다. .ajaxStop을 사용하는 것이 더 간단합니다. 감사! –

3

WatiN을 사용하여 일부 테스트를 진행하면서이 문제를 직접 만났습니다.

AJAX 의 더 나은 지원 테스트에 : 나는,이 테스트에서 Ajax를 처리하기위한 더 나은 지원이 추가되었다고 주장 version 1.1.0.4000 of WatiN에서 ((최신 버전은 12 월 20 일 2009)에서 2.0 RC2 인 5 월 2 2007 년 출시) 발견 이 출시 버전에서는 도구 상자에 더 많은 옵션 인 이 추가되었습니다.

일부 속성이 특정 값이 될 때까지 을 기다리는 새로운 방법이 추가되었습니다.이것은 요소 값이 이 업데이트 될 때까지 을 기다려야하는 상황 인 에서 편리 할 수 ​​있습니다.

예 :

// Wait until some textfield is enabled 
textfield.WaitUntil("disable", false.ToSting, 10); 
// Wait until some textfield is visible and enabled 
textfield.WaitUntil(new Attribute("visibile", new BoolComparer(true)) && new Attribute("disabled", new BoolComparer(false))); 

자세한 내용은 link to the release notes를 참조하십시오.

아직 자세히 조사하지 않았으므로 어떤 경우 유용할지 여부는 알 수 없습니다. 그러나 다른 사람이이 문제를 우연히 만난다면 언급 할 가치가 있다고 생각했습니다.

관련 문제