2013-07-10 8 views
8

Sto provando a testare una webapp che sto sviluppando. Sto usando il driver di Firefox contro Firefox 22.0.Errore di webdriver: "Nessun avviso è presente" dopo aver lanciato UnexpectedAlertPresentException

A un certo punto, potrebbe apparire una finestra di dialogo modale (un prompt di Javascript()). Se lo fa, voglio inserire del testo e poi chiuderlo (fai clic su OK).

Ecco il codice rilevante:

try: 
    if button.text == "Run": 
     button.click() 
except UnexpectedAlertPresentException: 
    alert = self.driver.switch_to_alert() 
    print alert.text 
    alert.send_keys('8080') 
    alert.dismiss() 

Il UnexpectedAlertPresentExceptionè che sono gettati. Tuttavia, non appena si prova ad eseguire print alert.text, ottengo:

`NoAlertPresentException: Message: u'No alert is present'`. 

Se rimuovo l'istruzione di stampa, scoppia a alert.send_keys con:

`WebDriverException: Message: u'fxdriver.modals.find_(...) is null'` 

io non capisco. Non è lo NoAlertPresentException per definizione che contraddice lo UnexpectedAlertPresentException che è stato lanciato e ha causato l'esclusione del blocco da eseguire in primo luogo?

Edit: Inoltre, non posso per la vita di me trovare alcuna documentazione sul UnexpectedAlertPresentException in http://selenium.googlecode.com/svn/trunk/docs/api/py/index.html#documentation

Edit 2: Questo è quello che ho adesso:

try: 
    if button.text == "Run": 
     button.click() 

     alert = self.driver.switch_to_alert() 

     alert.send_keys('1111') 
     alert.dismiss() 

except NoAlertPresentException: 
    pass 

Tuttavia, I' m ancora vedendo questo:

WebDriverException: Message: u'fxdriver.modals.find_(...) is null' 

sulla linea alert.send_keys('8080'). Suppongo che non capisco perché switch_to_alert() non getti NoAlertPresent se non c'è un avviso ... che è quello che presumo che lo WebDriverException indichi.

+0

Quello che posso dirti è che otterrai PIÙ di un solo tipo di errore. Quindi, per rendere più guerriero della strada, devi provare a gestire i 2 o 3 problemi più comuni, come timeout, non presente o imprevisto. È necessario importare ciascuno di essi da ** selenium.common.exceptions ** e aggiungere anche un blocco ** Tranne NameOfError **, quindi elaborarlo. Oggi vedo che posso mettere più di una sola eccezione, e ho anche imparato a ** passare ** dal tuo esempio di codice :) Amare Python e impararlo ogni giorno. – erm3nda

+0

Devi circondare con Try block that 'alert = self.driver.switch_to_alert()'. Stai costringendo lo script a passare a un avviso che forse NON è qui. Prova questo: http://pastebin.com/02RALuGp – erm3nda

+2

Penso che il problema con questo è che il gestore di eccezioni rimuove l'avviso dal browser. È un po 'controintuitivo. –

risposta

3

Penso che il selenio chiuda avvisi imprevisti. A quanto pare si può cambiare come il driver firefox tratta avvisi inaspettati: How to handle an Alert with "UnexpectedAlertBehaviour" capability in Selenium?

In alternativa, potreste controllare se c'è un avviso prima di agire (dopo tutto, se si vuole gestire l'avviso non è inaspettato) in questo modo (Java):

try { 
    Alert alert = _driver.switchTo().alert(); 
    //do stuff with alert 
} catch (final NoAlertPresentException e) { 
    //do non-alert stuff 
} 
+0

ho provato Questo. Dai un'occhiata alla mia domanda originale modificata. –

1

Potrei non essere il miglior programmatore di python, perché ho iniziato con esso 1 settimana fa. Mi sono creato per creare una piccola funzione che accetterà QUALSIASI avviso, e lo farà anche più avvisi.

Posizionando IF a WHILE alla linea -2 (seconda dalla coda) possiamo gestire anche conferme/avvisi consecutivi. Utilizzando IF è possibile gestire le risposte di conferma() Utilizzando WHILE è possibile gestire tutti gli avvisi(). Se l'avviso è in timeout, devi provare a "bypassare" l'avviso() nel momento giusto.

Sono riuscito ad aggiungere 2 gestori di eccezioni, per ignorare gli avvisi noti() e anche per interrompere quando non è presente alcun avviso().

import selenium 
from selenium import webdriver 
import os 
import time 
from selenium.common.exceptions import UnexpectedAlertPresentException 
from selenium.common.exceptions import NoAlertPresentException 

os.system("pkill php") 
os.system("php -S localhost:2222 alert.html &") 

fire = webdriver.Firefox() 
fire.get("http://localhost:2222") 
global alert 

def alert_accept(): 
    try: 
    alert = fire.switch_to_alert() 
    print "Aler text:" + alert.text 
    alert.accept() 
    print "Alert detected, accept it" 
    return True 
    except UnexpectedAlertPresentException: 
    print "Hum..., continue?" 
    return False 
    except NoAlertPresentException: 
    print "No alert here" 
    return False 

while alert_accept() == True: 
    alert_accept() 

Non puoi testarlo con qualsiasi sito web. Ho creato un html locale con alcuni avvisi diversi per scavare un po 'su questo.

codice HTML:

<script type="text/javascript"> 
var c = confirm("Do you like kidding yourself?") 
if (c == true) { 
    alert("true") 
} else { 
    alert("You're the kidding master, another alert!") 
} 
</script> 

<script type="text/javascript"> 
var c = confirm("Do you like kidding yourself?") 
if (c == true) { 
    alert("true") 
} else { 
    alert("You're the kidding master, another alert!") 
} 
</script> 

<script type="text/javascript"> 
console.log("Running test with timeout") 
</script> 

<script type="text/javascript"> 
setTimeout(function(){ 
    var c = confirm("Do you like kidding yourself?") 
if (c == true) { 
    alert("true") 
} else { 
    alert("You're the kidding master, another alert!") 
} 
}, 5000) 
</script> 

In realtà, il MENTRE né l'IF gestisce l'intera pagina, credo perché il timeout. Se si mettono tutte alle forze lo fa.

Sono abbastanza sicuro che questo può essere fatto utilizzando le attese implicite e le condizioni previste con un codice più breve. Se date un'occhiata alla fonte di alert_is_present vedrete nient'altro che un tentativo: blocco con return true/false.

1

Per il mio caso, devo fare clic sul pulsante Carica senza selezionare File e controllare che un messaggio di avviso sia in arrivo o meno. Ma nel mio caso mentre si fa clic sul pulsante Carica l'eccezione di seguito è in arrivo selenium.common.exceptions.UnexpectedAlertPresentException: Testo Alert: Messaggio: dialogo modale presente Nel mio caso alert.accept o alert.dismiss non funziona Quindi, Ho fatto premere Tab e selezionare il pulsante Carica e premere Invio chiave tramite codice Python. Funziona perfettamente.

Problemi correlati