Диалоги в событии onchange, инициированном Ватином - PullRequest
1 голос
/ 30 ноября 2011

У меня есть сайт с выпадающим списком.Когда пользователь изменяет выпадающий список, появляется диалоговое окно подтверждения, спрашивающее их, хотят ли они изменить его.Если они нажимают «да», он продолжается, в противном случае он остается прежним.Довольно стандартные вещи.

Однако, когда я приступил к написанию модульного теста Watin, это была боль.

Мой HTML - простой список выбора с идентификатором _stateList

Это мой javascript:

$(function() {
    $('#_stateList').change(function() {
        if(confirm('Are you sure you wish to change your state?'))
            //do something 
    });
});

Итак, в Watin у меня есть метод расширения для запуска события изменения:

public static void SelectWithChangeEvent(this SelectList selectList, string text)
{
    selectList.Select(text);
    string js = string.Format("$('#{0}').change();", selectList.Id);
    InternetExplorer.Browser.Eval(js); //This is where it hangs
}

Этот метод расширения вызывается здесь:

ConfirmDialogHandler dialogHandler = new ConfirmDialogHandler();
using (new UseDialogOnce(InternetExplorer.Browser.DialogWatcher, dialogHandler))
{
    PageMapping.StateDropdown.SelectWithChangeEvent(stateName); //It never gets past here
    dialogHandler.WaitUntilExists(5);
    if(dialogHandler.Exists())
        dialogHandler.OKButton.Click();
    else
        Assert.Fail("No Dialog Appeared");
}

Я действительно надеюсь, что это не слишком много кода, но я просто не могу понять, как обрабатывать диалог, который запускается в событии изменения, а не в событии щелчка.В Watin кнопки имеют ClickNoWait ().Есть ли что-нибудь подобное для Select?Или Эвал?Или, может быть, настройка, которая говорит, не ждать вообще?

Любая помощь приветствуется.

Ответы [ 2 ]

5 голосов
/ 01 декабря 2011

Завершение вашего JavaScript в setTimeout (function () {}); позволит Eval вернуться асинхронно.

public static void SelectWithChangeEvent(this SelectList selectList, string text) 
{ 
    selectList.Select(text); 
    string js = string.Format("setTimeout(function() {{$('#{0}').change();}}, 5);", selectList.Id); 
    InternetExplorer.Browser.Eval(js); //This is where it hangs 
} 

https://developer.mozilla.org/en/DOM/window.setTimeout

0 голосов
/ 30 ноября 2011

Одной из причин может быть тот факт, что вы забыли завершить утверждение if.

В вашем коде написано:

i$(function() {
$('#_stateList').change(function() {
    if(confirm('Are you sure you wish to change your state?')
        //do something 

});

Хотя этобыть:

$(function() {
    $('#_stateList').change(function() {
        if(confirm('Are you sure you wish to change your state?')){
            //do something 
        }
});
...