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

Tra*_*er1 7 jquery automation watin

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

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

Bap*_*net 7

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

目标是用C#编写:

Browser.WaitForEvent("#link", "onclick");
Run Code Online (Sandbox Code Playgroud)

我写了一个测试页面(可在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);
   }
}
Run Code Online (Sandbox Code Playgroud)

此方法使用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));
   }
}
Run Code Online (Sandbox Code Playgroud)

此监视器使用三个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');
};
Run Code Online (Sandbox Code Playgroud)

在这里,您需要在运行浏览器时将此javascript作为字符串注入您的页面.

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

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