2

我正在尝试单击 javascript 警报窗口的“确定”按钮。但是,该方法AddDialogHandler会抛出未设置为对象实例的对象引用。我究竟做错了什么?

// Class
IE browser;

button_click()
{
     var thread = new Thread(() =>
     {
        WatiN.Core.Settings.AutoStartDialogWatcher = false;
        browser = new IE(webBrowser1.ActiveXInstance);

        ReturnDialogHandler myHandler = new ReturnDialogHandler();

        browser.AddDialogHandler(myHandler); // This line throws exception

        browser.Button(Find.ById("alertButton")).ClickNoWait();
        myHandler.WaitUntilExists();

        myHandler.OKButton.Click();

        browser.WaitForComplete();

     });
     thread.Name = "KillAlertWindowAsync";
     thread.IsBackground = true;
     thread.SetApartmentState(ApartmentState.STA);
     thread.Start();
   }
}
4

2 回答 2

0

使用 Emerica 的代码,他使用的是一个新实例“Browser.DialogWatcher”。只有当您的浏览器是静态的时,这才应该有效。由于您已将浏览器对象定义为

browser = new IE(webBrowser1.ActiveXInstance);

您可以改为使用“browser.DialogWatcher”来调用该特定实例。但是要注意的一件事是 IE9 和对话框存在一个已知问题。我建议确保您拥有最新的 2.1 WatiN 版本。假设您已经拥有该版本,请尝试将 IE 设置为使用 IE 8 以确认它不是 IE 9 - WatiN 兼容性问题。为此,只需在浏览器中按 F12 并将浏览器和文档模式切换到 IE8。

于 2013-01-07T18:05:58.157 回答
0

你可以试试这个:

var approveConfirmDialog = new ConfirmDialogHandler();

using (new UseDialogOnce(Browser.DialogWatcher, approveConfirmDialog))
{
       //Your code to invoke popup.

       approveConfirmDialog.WaitUntilExists(); 
       approveConfirmDialog.OKButton.Click();
}

这是假设它是一个通用的 ok 弹出窗口。

于 2012-06-01T15:47:56.100 回答