我希望那里有人做过这件事。我有一些使用jQuery事件系统的自定义jQuery修改,以便启动某些事件进行处理。我希望能够针对这些进行自动化测试。
有没有人在从WatiN到jQuery的更好的合作?我在jQuery选择器上看到了一些关于直通的帖子,以及关于等待给定文本更改的帖子...如果有人添加了jQuery选择和事件支持,那就太酷了...甚至是document.getElementsBySelector可能很好。
答案 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/