2013-03-29 3 views
6

Problema: L'API GhostDriver non supporta ancora la gestione degli avvisi. C'è una soluzione accettabile per il momento, che consiste nell'iniettare il proprio javascript nella pagina che gestirà l'avviso e memorizzerà il testo per te.Come posso gestire un avviso con GhostDriver tramite Python?

Sto riscontrando problemi nell'usare questa soluzione alternativa tramite i binding di python webdriver. Potrebbe essere correlato alla mia comprensione del livello di novizio di javascript.

Ecco un esempio di soluzione che sto cercando di utilizzare: https://github.com/detro/ghostdriver/issues/20#issuecomment-15641983

sto usando un sito pubblico che dimostra un avviso per rendere questo più semplice: http://www.tizag.com/javascriptT/javascriptalert.php

Ecco il mio codice:

from selenium import webdriver 

button_xpath = "/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr/td/div[4]/form/input" 

js = """ 
(function() { 
var lastAlert = undefined; 
window.alert = function (message) { 
    lastAlert = message; 
}; 
window.getLastAlert = function() { 
    var result = lastAlert; 
    lastAlert = undefined; 
    return result; 
}; 
}()); 
""" 

driver = webdriver.PhantomJS() 
driver.get('http://www.tizag.com/javascriptT/javascriptalert.php') 
driver.execute_script("window.alert = %s" % js) 
driver.find_element_by_xpath(button_xpath).click() 
#exception just occured 
driver.execute_script("return window.getLastAlert && window.getLastAlert();") 

L'eccezione è:

WebDriverException: Message: u'Error Message => \'Click failed: TypeError: \'undefined\' is not a function (evaluating \'alert(\'Are you sure you want to give us the deed to your house?\')\')\'\n caused by Request => {"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:41752","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"POST","post":"{\\"sessionId\\": \\"0eaf7680-9897-11e2-b375-55b9cb6ceb0f\\", \\"id\\": \\":wdc:1364578560610\\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/0eaf7680-9897-11e2-b375-55b9cb6ceb0f/element/%3Awdc%3A1364578560610/click"}' ; Screenshot: available via screen 

Sono un JOB noob. Spero che qualcuno possa indicarmi la giusta direzione.

risposta

10

Una soluzione semplice è riscrivere il metodo window.alert per generare l'argomento in una variabile globale.

Definire la variabile di iniezione js con la funzione di esclusione:

js = """ 
window.alert = function(message) { 
lastAlert = message; 
} 
""" 

E poi basta passare la variabile js attraverso la chiamata execute_script in pitone come questo:

driver.execute_script("%s" % js) 

Poi, quando tutto è stato gestito è possibile eseguire un ritorno sul lastAlert globale:

driver.execute_script("return lastAlert") 
+0

Sì! Funziona perfettamente. Grazie! – brma

4

T la sua è una soluzione alternativa.

Utilizzare questo per ogni pagina ricaricata che avrebbe un avviso più tardi.

driver.execute_script("window.confirm = function(){return true;}"); 

Questo funziona per PhantomJS all'interno Selenium/Splinter.

Vedere ulteriori riferimenti here.

+1

Questo potrebbe sembrare ovvio, ma mi ci è voluto un po 'di tempo per capire che è necessario eseguire la javascript ** prima ** del clic del pulsante (o prima che venga generato l'avviso) – user3745794