15

使用 Watin,我正在尝试处理确认对话框并告诉 watin 按“确定”。这在互联网上有很好的记录 - 你使用 aConfirmDialogHandlerUseDialogOnce方法.. 除非它对我不起作用。我收到以下错误:

WatiN.Core.Exceptions.WatiNException: Dialog not available within 5 seconds

我使用的是 watin 2.0 beta atm,但我之前使用的是 1.X 的早期版本,它有同样的问题。在运行 64 位 Vista 的同事机器上测试,我正在运行 64 位 Windows 7。

代码如下所示:

        using (IE ie = new IE("http://localhost/TestApp/TestConfirmPage.asp"))
        {
            var approveConfirmDialog = new ConfirmDialogHandler();

            using (new UseDialogOnce(ie.DialogWatcher, approveConfirmDialog))
            {
                ie.Button(Find.ByName("btn")).ClickNoWait();
                approveConfirmDialog.WaitUntilExists(5);
                approveConfirmDialog.OKButton.Click();
            }
            ie.WaitForComplete();
        }

ASP 页面非常简单,它由一个强制确认按钮组成,如下所示:

<input type="button" name="btn" id="btn" value="Click me" onclick="ConfirmApp()"  />

并且ConfirmApp已被剥离以进行测试,因此现在它包含的只是:

 bOK = confirm("You clicked a popup. Did you mean to?");
 return bOK;
4

4 回答 4

11

代码对我来说看起来不错,我认为它应该可以工作。我唯一不同的想法是使用 Dialog 块将 Wait for Complete 放在里面。不知道为什么,但在我这样做之前我也遇到了一些问题,有时它有效,有时它不起作用。而且我不使用等待直到存在的时间限制。但是您可能已经尝试过那个。

例如:

using (new UseDialogOnce(ie.DialogWatcher, approveConfirmDialog))
        {
            ie.Button(Find.ByName("btn")).ClickNoWait();
            approveConfirmDialog.WaitUntilExists();
            approveConfirmDialog.OKButton.Click();
            ie.WaitForComplete();
        }
于 2009-05-27T09:54:50.523 回答
2

我遇到了同样的问题并尝试了很多事情,但只是忽略了我正在调用的一部分 .Click() 然后将其更改为 .ClickNoWait() 并进行了排序。希望这可以帮助

于 2012-12-08T16:41:46.567 回答
1

我遇到了同样的问题,无论我做什么,它都不起作用,直到我找到了一个需要时间但对我有用的解决方法。

默认时间为WaitUntilExists() 30 秒,因此在 IE9 中使用时,请提供如下延长时间限制。

handler.WaitUntilExists(40); // or whatever time suits you above 30

这当然需要时间,但它确实有效。

于 2012-03-19T11:09:56.230 回答
0

Just spent a couple of hours with variations on the dialog watcher solution. Nothing worked for me in IE9.

I ended up with a one-liner that works for me, hope it helps somebody else! This approach completely avoids trying to deal with the dialog by using user key presses instead.

  • For OK. Do all steps leading up to button ClickNoWait, then:

SendKeys.SendWait("{ENTER}");

  • For CANCEL. Do all steps leading up to element ClickNoWait, then: SendKeys.SendWait("{TAB}"); SendKeys.SendWait("{ENTER}");

nb: using System.Windows.Forms

于 2013-10-30T16:51:42.887 回答