2009-05-19 7 views
15

Utilizzando Watin, sto tentando di gestire una finestra di dialogo di conferma e dire a watin di premere "OK". Questo è perfettamente documentato su internet - si usa un ConfirmDialogHandler e il metodo UseDialogOnce .. Tranne che non funziona per me. Ottengo il seguente errore:Watin - Gestione delle finestre di dialogo di conferma con ConfirmDialogHandler

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

sto usando la versione beta Watin 2.0 atm, ma ero in precedenza con una versione precedente di 1.X che aveva lo stesso problema. Testato su una macchina che esegue i colleghi a 64 bit di Vista, sto correndo a 64 bit di Windows 7.

Il codice è simile al seguente:

 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(); 
     } 

La pagina ASP è molto semplice, si compone di un pulsante che le forze una conferma, in questo modo:

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

E ConfirmApp è stato messo a nudo giù per le prove in modo che ora tutto ciò che contiene è:

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

correlati: http://stackoverflow.com/questions/5626538/watin-ie9-cant-click-ok-buttons/9769242#9769242 –

risposta

11

Il codice mi sembra buono, e penso che dovrebbe funzionare. L'unico pensiero che ho fatto in modo diverso è stato mettere Wait for Complete all'interno usando il blocco Dialog. Non so perché, ma prima di farlo ho anche alcuni problemi, a volte funziona a volte no. E non uso limiti di tempo in Attesa fino a quando esiste. Ma probabilmente l'hai già provato.

Ad esempio:

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

Usando una combinazione di codice cambia come questo e un aggiornamento delle DLL lo ha ordinato. –

1

stavo affrontando lo stesso problema e non importa quello che faccio non funzionava fino a quando ho trovato una soluzione alternativa che prendere tempo, ma funziona per me.

Il tempo di attesa predefinito per WaitUntilExists()è di 30 secondi, quindi quando si utilizza in IE9 fornire il limite di tempo esteso come segue.

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

Certamente vorrà del tempo, ma funziona.

2

Ho avuto lo stesso problema e ho provato molte cose, ma ho trascurato una parte che stavo chiamando .Click() e poi ho appena cambiato in .ClickNoWait() e le cose sono state ordinate. Spero che questo aiuti

0

Appena trascorso un paio d'ore con variazioni sulla soluzione di osservatore di dialogo. Niente ha funzionato per me in IE9.

Ho finito con un one-liner che funziona per me, spero che aiuti qualcun altro! Questo approccio evita completamente di provare a gestire la finestra di dialogo usando invece la pressione dei tasti dell'utente.

  • Per OK. Fai tutti i passaggi che portano al pulsante ClickNoWait, quindi:

SendKeys.SendWait ("{ENTER}");

  • Per ANNULLA. Fai tutti i passaggi che portano all'elemento ClickNoWait, quindi: SendKeys.SendWait ("{TAB}"); SendKeys.SendWait ("{ENTER}");

NB: utilizzando System.Windows.Forms