2011-01-20 19 views
7

Mam nadzieję, że ktoś tam to zrobił. Mam pewne niestandardowe modyfikacje jQuery, które wykorzystują system zdarzeń jQuery w celu uruchomienia pewnych zdarzeń do przetworzenia. Chciałbym móc przeprowadzić automatyczne testy w odpowiedzi na te.Z WatiN, chciałbym poczekać na wydarzenie jQuery

Czy ktoś pracował na lepszym połączeniu od WatiN do jQuery? Widziałem kilka wpisów w przejściówce dla selektorów jQuery, a także post tutaj o oczekiwaniu na zmianę danego tekstu ... Byłoby fajnie, gdyby ktoś dodał wybór jQuery, a obsługa zdarzeń ... nawet document.getElementsBySelector może być miłe.

+0

Co dokładnie chcesz zrobić? moje testy internetowych użył kodu jQuery, który jest wstrzykiwany na każdej stronie, to kod pozwalają rozszerzenia przeglądarki Watin z dwóch metod, po jednym dla selektora CSS i inny dla waitForAjaxComplete (które używane niektóre wiążące .AjaxStart i .AjaxStart na stronie jQuery). Jestem pewien, że mogę ci pomóc. Czy macie przykład tego, co chcecie zrobić po stronie WatiN? –

+0

w jQuery, mam przedłużony ramy poprawności jQuery i mieć kilka wydarzeń, które chcą słuchać stronie serwera .... kiedy „validation.success” Zdarzenie w formie, chcę zrobić waitfor po stronie serwera który nasłuchuje tego zdarzenia, a kiedy to zrobi, sprawdź wyniki ... to samo dla "validation.failure" itp. To pozwoliłoby mi przetestować wyniki sprawdzania poprawności z perspektywy przeglądarki. Innym przykładem może być przywrócenie pewnych wyników adaptacyjnych jako JSON, a nie HTML. – Tracker1

+0

Powyższe jest jednym z przykładów ... W Essense, chciałbym mieć kilka więzi podczas gdy przeglądarka jest otwarta, czekając na wydarzeniach z dochodzić ... wypowiedzi, które mogą być badane przed. Słuchanie zdarzeń opartych na jQuery. – Tracker1

Odpowiedz

7

Nie wiem, czy to jest to, czego się spodziewasz, ale miałem trochę czasu na zbadanie i przyszedł mi z rozwiązaniem na pytanie: Z WatiN, Chciałbym czekać na wydarzenie jQuery.

Celem jest, aby pisać w C#:

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

pisałem stronę testową (na http://www.sp4ce.net/debug.html), w którym to zdarzenie wyzwala onclick na link po kliknięciu na przycisku.

Potem napisał metodę rozszerzenia .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); 
    } 
} 

Metoda ta wykorzystuje to sprawdzić to zdarzenie zostało nazywany EventMonitorWatcher.

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)); 
    } 
} 

Monitor użycie trzech javascript (jQuery) Zasilanie metody, które rozpoczyna monitorowanie, zatrzymuje monitorowania i kontroli, jeśli zdarzenie zostało nazwane.

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'); 
}; 

Tutaj musisz wstrzyknąć ten javascript jako ciąg twoją stronę po uruchomieniu przeglądarki.

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

W tym teście, po kliknięciu przycisku "kliknij", test powinien zakończyć się bezpośrednio, a Twoja przeglądarka zostać zamknięta;

+0

To jest naprawdę cool ... idealnie, chciałbym, aby móc zarówno słuchaj danego zdarzenia i analizuj wynik, jako detektor, jak nazywa się wydarzenie.W moim przypadku nie jest to zdarzenie przeglądarki, ale niestandardowe zdarzenie jQuery. .. nie wiem, czy jest to w ogóle możliwe. – Tracker1

3

Dlaczego nie wstrzyknąć trochę javascriptu, który łączy się z wydarzeniami, których chcesz słuchać. W swoim kodzie zdarzenia javascript, który zostanie wywołany po wywołaniu zdarzenia, możesz dodać element do DOM z wynikami, które Cię interesują. Utwórz div dla instancji i ustaw innerHtml z wynikiem, który chcesz sprawdzić. Podaj Div unikalny identyfikator.

przepływ podstawowy:

  • browser.RunScript (javascript_here_to_attach_to_the_events_you_are_interested_in) Załóżmy, że gdy zdarzenie jest opalane Twój wstrzykuje kod tworzy div z id = "my_event_result".

  • Wykonaj czynności, które powodują swój kod weryfikacyjny (jak wprowadzanie dobrych/złych wartości) przykład: browser.TextField (textFieldIdWithValidation) .Typetext ("niektóre wartości");

  • Poczekaj na pojawienie się Div: browser.Div ("my_event_result").WaitUntilExists();

  • Zatwierdź wartości w podzbiorze: wynik bool = przeglądarka.Div ("moje_wybranie_wyników") Tekst == "Oczekiwany test";

HTH, Jeroen

0

Nie oczekuję tego, aby być dobrym rozwiązaniem, ponieważ nie mam czasu na sprawdzenie Watin, zaledwie kilka notatek, które pomogą Ci zrobić swoją rzecz , 1 plaster małpa jQuery:

od wszystkich zdarzeń jQuery jest wyzwalany przy spuście funkcyjnego.

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

W ten sposób strona alert wszystkie argumenty podane za każdym razem coś jest wyzwalany (jako ciąg z „-” jako separator), zazwyczaj pierwszy argument byłby wydarzeniem. Watin powinien mieć jakąś funkcję, która będzie przechwytywać powiadomienia, jeśli nie sugeruję upuszczenie go i będzie z watij czy coś, osobiście polecam HTMLUNIT

Dodatkowo jeśli zainteresowany tym, co wywołało zdarzenie, wewnątrz funkcji powyżej, this będzie wskaż że :)

Rzeczy powinieneś sprawdzić:
http://api.jquery.com/event.result/
http://api.jquery.com/event.data/

Powiązane problemy