2009-05-19 59 views
15

使用Watin,我试图处理一个确认对话框并告诉watin按“OK”。这是在互联网上可以很好地记录 - 你使用ConfirmDialogHandlerUseDialogOnce方法..除了它不适合我。我得到以下错误:Watin - 使用ConfirmDialogHandler处理确认对话框

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

我使用的是华廷2.0测试版的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; 
+0

相关:http://stackoverflow.com/questions/5626538/watin-ie9-cant-click-ok-buttons/9769242#9769242 – 2012-03-19 12:10:05

回答

11

该代码看起来很好,我认为它应该工作。唯一觉得我做了不同的事情是使用Dialog块放入Wait for Complete。不知道为什么,但在我做之前,我也有一些问题,有时它有时不起作用。在等待直到存在之前,我不会使用时间限制。但你可能已经尝试过那个。

例如:

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

使用的组合的代码更改就像这样,并且刷新的DLL将它排序。 – 2010-08-13 15:14:19

1

我面临着同样的问题,不管我做什么,它没有工作,直到我发现了一个解决办法这需要时间,但为我工作。

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

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

这当然需要时间,但它的工作原理。

2

我有同样的问题,并尝试了很多东西,但只是忽略了一部分我打电话.Click(),然后只是改变它.ClickNoWait()和事情排序。希望这可以帮助

0

刚刚花了几个小时,对话观察者解决方案的变化。在IE9中没有任何工作适合我。

我结束了一个为我工作的单线程,希望它可以帮助别人!这种方法完全避免了试图通过使用用户按键来处理对话。

  • 对于确定。执行导致按钮ClickNoWait的所有步骤,然后:

SendKeys.SendWait(“{ENTER}”);

  • 对于取消。执行导致元素ClickNoWait的所有步骤,然后: SendKeys.SendWait(“{TAB}”); SendKeys。SendWait( “{} ENTER”);

NB:使用System.Windows.Forms的