有了WatiN,我想等一个jQuery事件

时间:2011-01-20 00:23:12

标签: jquery automation watin

我希望那里有人做过这件事。我有一些使用jQuery事件系统的自定义jQuery修改,以便启动某些事件进行处理。我希望能够针对这些进行自动化测试。

有没有人在从WatiN到jQuery的更好的合作?我在jQuery选择器上看到了一些关于直通的帖子,以及关于等待给定文本更改的帖子...如果有人添加了jQuery选择和事件支持,那就太酷了...甚至是document.getElementsBySelector可能很好。

3 个答案:

答案 0 :(得分:7)

我不知道它是否符合您的期望,但我有时间进行调查,我找到了问题的解决方案:使用WatiN,我想等待jQuery事件。< / em>的

目标是用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 powered)方法启动监视,停止监视并检查事件是否已被调用。

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

在此测试中,当您单击“单击”按钮时,测试应直接结束并关闭浏览器;

答案 1 :(得分:3)

为什么不注入一些附加到你想要监听的事件的javascript。在事件发生时调用的javascript事件代码中,您可以使用您感兴趣的结果向DOM添加元素。例如,创建Div并使用要检查的输出设置innerHtml。给Div一个唯一的ID。

基本流程:

  • browser.RunScript(javascript_here_to_attach_to_the_events_you_are_interested_in) 让我们假设当事件被触发时,您注入的代码会创建一个Id =“my_event_result”的Div。

  • 执行触发验证码的操作(例如输入正确/错误值) 示例:browser.TextField(textFieldIdWithValidation).Typetext(“some value”);

  • 等待Div出现: browser.Div( “my_event_result”)WaitUntilExists();

  • 断言div中的值: bool result = browser.Div(“my_event_result”)。文字==“预期的测试”;

HTH, 的Jeroen

答案 2 :(得分:0)

我不希望这是正确的答案,因为我没有时间查看WatiN,只有几个笔记可以帮助你做你的事情,第一个猴子补丁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/