由Watin触发的onchange事件中的对话框

mcc*_*002 1 c# jquery watin unit-testing

我有一个带下拉列表的网站.当用户更改下拉列表时,会出现一个确认对话框,询问他们是否要更改它.如果他们单击是,则继续,否则保持不变.很标准的东西.

然而,当我写Watin单元测试时,这是一个痛苦.

我的html是一个简单的选择列表,其id为_stateList

这是我的javascript:

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

所以在Watin中,我有一个扩展方法来触发change事件:

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
}
Run Code Online (Sandbox Code Playgroud)

这里称为扩展方法:

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");
}
Run Code Online (Sandbox Code Playgroud)

我真的希望这不是太多的代码,但我根本无法弄清楚如何处理在更改事件而不是单击事件中触发的对话框.在Watin中,按钮具有ClickNoWait().Select有什么相似的吗?还是Eval?或者也许是一个不等待的设置?

任何帮助表示赞赏.

Pat*_*sey 5

在setTimeout(function(){})中包装你的javascript; 将允许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 
} 
Run Code Online (Sandbox Code Playgroud)

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