2011-01-20 6 views
7

나는 누군가가이 작업을 수행하기를 바라고 있습니다. 처리를 위해 특정 이벤트를 시작하기 위해 jQuery 이벤트 시스템을 사용하는 사용자 정의 jQuery 수정이있다. 나는 이것들에 반응하여 자동화 된 테스트를 할 수 있기를 바란다.WatiN에서 jQuery 이벤트를 기다리고 싶습니다.

WatiN에서 jQuery에 이르기까지 누구와도 더 친숙한 관계가 있습니까? 나는 jQuery 셀렉터를위한 패스 스루에 대한 몇 가지 게시물을 보았을뿐 아니라 주어진 텍스트가 바뀌기를 기다리는 게시물을 보았다. 누군가 jQuery 셀렉션을 추가하고 이벤트 지원을했다면 멋지 겠지 ... 심지어 document.getElementsBySelector 좋을지도 몰라.

+0

정확히 무슨 당신이 원하는 무엇입니까? 내 웹 테스트는 각 페이지에 삽입 된 jQuery 코드를 사용했으며이 코드는 CSS 선택기와 waitForAjaxComplete (jQuery 측에서 .AjaxStart 및 .AjaxStart에 대한 바인딩을 사용함)에 대한 두 가지 방법으로 Watin 브라우저의 확장을 허용합니다. 내가 너를 도울 수 있다고 확신한다. 그럼 WatiN 측에서하고 싶은 것을 보여주는 예가 있습니까? –

+0

jQuery에서 jquery 유효성 검사 프레임 워크를 확장하고 서버 측 수신 대기 할 이벤트가 두 개 있습니다 .... 폼의 "validation.success"이벤트가 발생하면 waitfor 서버 측 작업을 수행하려고합니다. 그 이벤트를 청취하고 파일을 열 때 "validation.failure"등등과 같은 결과를 검사하십시오 ... 그러면 브라우저 관점에서 유효성 검사 결과를 테스트 할 수 있습니다. 또 다른 예는 특정 적응 형 결과를 HTML이 아닌 JSON으로 되돌려 놓는 것입니다. – Tracker1

+0

위의 예는 ... 예를 들어, 브라우저가 열려 있고 테스트 할 수있는 Assert ... 문을 사용하여 이벤트를 기다리는 동안 약간의 관계를 갖고 싶습니다. jQuery 기반 이벤트 수신. – Tracker1

답변

7

내가 기대하는 바를 모르겠지만 조사 할 시간이 있었고 질문에 대한 해결책을 찾았습니다. WatiN을 사용하면 jQuery 이벤트가 발생하기를 기다리고 싶습니다.

목표는 C#으로 작성하는 것입니다 :

Browser.WaitForEvent("#link", "onclick"); 

난 당신이 버튼을 클릭 할 때 링크에 onclick 이벤트를 트리거 ( http://www.sp4ce.net/debug.html시) 테스트 페이지를 썼다.

은 그 때 나는이 방법이 호출 된 경우입니다 점검하십시오 EventMonitorWatcher을 사용하는 확장 메서드를 .WaitForEvent

public static void WaitForEvent(this Browser browser, string selector, string eventname) 
{ 
    using (EventMonitorWatcher monitor = new EventMonitorWatcher(browser, selector, eventname)) 
    { 
     int timeWaited = 0; 
     var maxTimeWait = Settings.WaitForCompleteTimeOut * 1000; 
     do 
     { 
     Thread.Sleep(Settings.SleepTime); 
     timeWaited += Settings.SleepTime; 
     } 
     while (!monitor.IsEventCalled() && timeWaited < maxTimeWait); 
    } 
} 

을 썼다. 이벤트를 호출 한 경우, 모니터링 시작

public class EventMonitorWatcher : IDisposable 
{ 
    private readonly Browser _browser; 
    private readonly string _selector; 
    private readonly string _eventname; 

    public EventMonitorWatcher(Browser browser, string selector, string eventname) 
    { 
     _browser = browser; 
     _selector = selector; 
     _eventname = eventname; 
     _browser.Eval(string.Format("startEventMonitor('{0}', '{1}')", _selector, _eventname)); 
    } 

    public bool IsEventCalled() 
    { 
     string result = _browser.Eval(string.Format(
     "isEventCalled('{0}', '{1}')", _selector, _eventname)); 
     return result == "true"; 
    } 

    public void Dispose() 
    { 
     _browser.Eval(string.Format("stopEventMonitor('{0}', '{1}')", _selector, _eventname)); 
    } 
} 

이 모니터 사용 세 자바 스크립트 (JQuery와 전원) 방법은 모니터링 및 검사를 멈춘다.

startEventMonitor = function(selector, event) { 
    $(selector).data('eventMonitorResult', false); 
    var eventMonitorHandler = function() { 
     $(selector).data('eventMonitorResult', true) 
    }; 
    $(selector).data('eventMonitorHandler', eventMonitorHandler); 
    $(selector).bind(event, eventMonitorHandler); 
}; 

stopEventMonitor = function(selector, event) { 
    $(selector).undbind(event, $(selector).data('eventMonitorHandler')); 
    $(selector).data('eventMonitorResult', false); 
}; 

isEventCalled = function(selector, event) { 
    return $(selector).data('eventMonitorResult'); 
}; 

브라우저를 실행할 때이 자바 스크립트를 페이지 문자열로 삽입해야합니다.

[Test] 
public void Test() 
{ 
    using(var browser = new IE("http://www.sp4ce.net/debug.html") 
    { 
     browser.Eval(JavaScript); 
     browser.WaitForEvent("#link", "onclick"); 
    } 
} 

이 테스트에서 "클릭"버튼을 클릭하면 테스트가 직접 끝나고 브라우저가 닫혀 야합니다.

+0

이것은 정말 멋지다 ... 이상적으로는 둘 다 주어진 이벤트를 듣고 그 결과를 이벤트가 호출 될 때 리스너로 해석합니다. 제 경우에는 브라우저 이벤트가 아니지만 사용자 정의 jQuery 이벤트입니다. 이것이 가능한지 확실하지 않습니다. – Tracker1

3

당신이 듣고 싶은 이벤트 (들)에 붙이는 자바 스크립트를 삽입하지 마십시오. 이벤트가 발생하면 호출되는 자바 스크립트 이벤트 코드에서 관심있는 결과가있는 DOM에 요소를 추가 할 수 있습니다. 예를 들어 Div를 만들고 확인하려는 출력으로 innerHtml을 설정합니다. 사업부에게 고유 한 ID를 부여하십시오.

기본 흐름 :

  • browser.RunScript (javascript_here_to_attach_to_the_events_you_are_interested_in) 는 이벤트가 발생하면 사용자 삽입 된 코드는 아이디 = "my_event_result"와 사업부 생성한다고 가정 할 수 있습니다.

  • 유효/부적합 값 입력과 같은 동작을 수행하십시오. 예 : browser.TextField (textFieldIdWithValidation) .Typetext ("some value");

  • Div가 나타날 때까지 기다리십시오. browser.Div ("my_event_result").WaitUntilExists();

  • div의 값을 지정하십시오. bool result = browser.Div ("my_event_result") 텍스트 == "예상 테스트";

HTH, 제론

은 내가 WatiN을 확인하는 시간을 가지고 있겠지 때문에 정답이 될이에 대한 기대 아니에요
0

이 도움이 될 것입니다 노트 단지 몇 당신이 당신의 일을 , 1 차 원숭이 패치 jQuery :

모든 jQuery 이벤트는 함수 트리거로 트리거되기 때문에. 일반적으로 첫 번째 인수는 이벤트가 될 것입니다, - (구분자로 ''의 문자열로)

var _trigger = jQuery.prototype.trigger; 
jQuery.prototype.trigger = function() { 
     _trigger.apply(this, arguments); 
     alert(Array.prototype.join.call(arguments, '-')); 
} 

뭔가가 트리거 될 때마다 주어진 모든 인수 페이지가 경고를 만들 것입니다. 나는 그것을 삭제하고 watij 또는 뭔가가는 제안하지 않을 경우 WatiN 개인적으로 내가 추천, 경고를 캡처 기능의 어떤 종류를해야

HTMLUNIT 또한 경우, this는 것 위의 함수 내에서 이벤트를 트리거에 관심 그 :) 가리킨

물건을 체크 아웃해야합니다
http://api.jquery.com/event.result/
http://api.jquery.com/event.data/

관련 문제