Я не знаю, ожидаете ли вы этого, но у меня было некоторое время для изучения, и я пришел к решению вопроса: С 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");
}
}
В этом тесте, когда вы нажимаете кнопку «щелкнуть», тест должен завершиться напрямую, а ваш браузер должен быть закрыт;