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

时间:2011-11-30 07:03:34

标签: c# jquery unit-testing watin

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

但是,当我开始编写Watin单元测试时,这很痛苦。

我的html是一个简单的选择列表,其id为_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有什么相似的吗?还是Eval?或者也许是一个不等待的设置?

感谢任何帮助。

2 个答案:

答案 0 :(得分: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 
} 

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

答案 1 :(得分:-2)

其中一个原因可能是您忘记结束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 
        }
});