이 문제를 해결하기 위해 몇 가지 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);
}
}
모니터가 자바 스크립트가 삽입되기 전에 하나 이상의 아약스 요청이 시작되지 않으면 (이 시점에서 카운터가 더 이상 정확하지 않은 경우)이 솔루션은 잘 작동합니다. WatiN의 프로세스 초기에 모니터를 삽입하는 방법을 모르겠습니다. 테스트를 실행할 때 jquery가 포함 된 직후 모니터를 조건부로 포함하는 것이 가장 좋은 방법 일 수 있습니다. –
글로벌 Ajax 이벤트 핸들러를 애플리케이션의 마스터 페이지에 넣습니다. 또한 카운터 대신 세마 폰 비트 만 유지합니다. http://lebobitz.wordpress.com/2011/03/06/synchronizing-watin-and-ajax-with-jquery/ –
코드에 문제가 하나 있습니다. 웹 사이트에 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