С WatiN я бы хотел дождаться события jQuery - PullRequest
7 голосов
/ 20 января 2011

Я надеюсь, что кто-то там сделал это. У меня есть несколько пользовательских модификаций jQuery, которые используют систему событий jQuery для запуска определенных событий для обработки. Я хотел бы иметь возможность проводить автоматическое тестирование в ответ на эти вопросы.

Кто-нибудь работал над улучшением связи между WatiN и jQuery? Я видел несколько постов о проходе для селекторов jQuery, а также пост о ожидании изменения текста ... Было бы здорово, если бы кто-то добавил выбор jQuery и поддержку событий ... даже document.getElementsBySelector может быть хорошо.

Ответы [ 3 ]

7 голосов
/ 21 января 2011

Я не знаю, ожидаете ли вы этого, но у меня было некоторое время для изучения, и я пришел к решению вопроса: С WatiN я хотел бы дождаться события jQuery.

Цель состоит в том, чтобы написать на C #:

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

Я написал тестовую страницу (доступна на http://www.sp4ce.net/debug.html), где она вызывает событие onclick по ссылкекогда вы нажимаете на кнопку.

Затем я написал метод расширения .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);
   }
}

Этот метод использует 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));
   }
}

В этом мониторе используются три метода javascript (с поддержкой 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');
};

Теперь вам нужновставьте этот javascript как строку вашей страницы при запуске браузера.

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

В этом тесте, когда вы нажимаете кнопку «щелкнуть», тест должен завершиться напрямую, а ваш браузер должен быть закрыт;

3 голосов
/ 02 февраля 2011

Почему бы не внедрить некоторый JavaScript, который присоединяется к событию (ям), который вы хотите прослушать.В вашем коде события javascript, который вызывается при возникновении события, вы можете добавить в DOM элемент с интересующими вас результатами. Например, создайте Div и установите innerHtml с выходом, который вы хотите проверить.Присвойте Div уникальный идентификатор.

Основной поток:

  • browser.RunScript (javascript_here_to_attach_to_the_events_you_are_interested_in) Предположим, что при запуске события введенный код создает Div сId = "my_event_result".

  • Выполните действия, которые вызывают ваш код проверки (например, ввод хороших / неправильных значений), например: browser.TextField (textFieldIdWithValidation) .Typetext ("some value");

  • Ожидание появления Div: browser.Div ("my_event_result"). WaitUntilExists ();

  • Утверждение значения (с)) в div: bool result = browser.Div ("my_event_result"). Text == "Ожидаемый тест";

HTH, Jeroen

0 голосов
/ 06 февраля 2011

Я не ожидаю, что это будет правильный ответ, так как у меня нет времени, чтобы проверить WatiN, просто пара замечаний, которые помогут вам сделать свое дело, 1-й патч обезьяны jQuery:

так как все события jQuery запускаются с помощью триггера функции.

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

Это заставит вашу страницу предупреждать обо всех аргументах, переданных каждый раз, когда что-то срабатывает (как строка с '-' в качестве разделителя), обычно первым аргументом будет событие.У WatiN должна быть какая-то функция, которая будет перехватывать оповещения, если я не предлагаю сбросить их и использовать watij или что-то еще, лично я рекомендую HTMLUNIT

Дополнительно, если вы заинтересованы в том, что вызвало событиевнутри функции, указанной выше, this будет указывать на это :)

Материал, который вы должны проверить:
http://api.jquery.com/event.result/
http://api.jquery.com/event.data/

...