我有一个Web应用程序,在某些情况下会弹出我需要在WatiN测试中做出反应的JavaScript alert()。谷歌在2007年的Handling alerts in WATIN指出我看起来很有希望,并且我将该帖子中的示例代码改编为以下(匿名):
private void MyAssert(IE browser, WatinHelper helper)
{
AlertDialogHandler alertDialogHandler = new AlertDialogHandler();
using (new UseDialogOnce(browser.DialogWatcher, alertDialogHandler))
{
// DoWrong() causes a JavaScript alert(); false means use nowait.
DoWrong(helper, false);
alertDialogHandler.WaitUntilExists(10 /*seconds*/);
if (!alertDialogHandler.Exists())
{
Assert.Fail("No JavaScript alert when it should have been there");
}
alertDialogHandler.OKButton.Click();
}
SecondAssert(browser);
}
但是,当调用DoWrong()时,警报几乎立即显示(正如它应该的那样),对alertDialogHandler.WaitUntilExists()的调用最终会失败并显示WatiNException: Dialog not available within 10 seconds..
。唯一的问题是,我可以看到对话框最明显地出现在屏幕上。
我可能错过了一些简单的东西;有人能指出我正确的方向吗?
我还尝试了以下两种变体,以及它们的一些变体,没有运气;我一直得到同样的错误。
AlertDialogHandler alertDialogHandler = new AlertDialogHandler();
DoWrong(helper, false);
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
do
{
}
while (!alertDialogHandler.Exists() && stopwatch.Elapsed.TotalMilliseconds < 3000);
Assert.IsTrue(alertDialogHandler.Exists(), "No JavaScript alert when it should have been there");
alertDialogHandler.OKButton.Click();
SecondAssert(browser);
和
AlertDialogHandler alertDialogHandler = new AlertDialogHandler();
browser.DialogWatcher.Add(alertDialogHandler);
DoWrong(helper, false);
alertDialogHandler.WaitUntilExists();
alertDialogHandler.OKButton.Click();
browser.WaitForComplete();
Assert.IsFalse(alertDialogHandler.Exists());
SecondAssert(browser);
是的,我知道代码变得有点难看,但是现在我主要想让它完全运行。如果它因为第二次尝试中的紧密循环而在100%利用率下烹饪CPU几秒钟,但只做了我需要它(简单明了,忽略 alert()) ,没关系。
答案 0 :(得分:1)
这是WatiN和IE8的问题以及IE8改变弹出窗口的方式。该问题已在项目的Sourceforge SVN存储库中可用的当前代码中修复。得到它,编译它,你的问题就解决了。
WatiN的新版本将在今年年底之前发布。
HTH, 的Jeroen