2010-08-16 3 views
6

Come posso ottenere registri di richiesta/risposta nel selenio? Ho una chiamata AJAX che restituisce le informazioni di login, e ogni volta che provo a catturare tramite:Come ottengo le intestazioni di risposta in selenio?

selenium.captureNetworkTraffic("json"); 

restituisce solo gli elementi sul lato client (come le immagini .PN), ma non la risposta JSON attuale mi interessa in.

+0

qualcuno mi può aiutare, ho pensato che il selenio dovrebbe ovviamente avere click fatti dentro e risposta da esso ?? nessuno ha provato questo ?? – sasikumar

risposta

8

Sfortunatamente, non sembra che si possa fare ciò con il solo selenio in modo automatico, poiché questo è against their design principles for selenium. Non sono d'accordo che lo sia (dal momento che supporta l'acquisizione di informazioni sui cookie - cosa l'utente effettivamente passa e analizza attraverso i loro cookie?).

Il loro "schtick" è che il selenio consente di automatizzare ciò che un utente fa; poiché un utente non si preoccupa delle intestazioni di risposta, perché questo framework? Per me, questo è deludente perché devo assicurarmi che il tipo di contenuto che viene restituito sia quello che ritengo dovrebbe essere (testare un'API). Sembra che another Stack Overflow question sia giunto a una conclusione simile.

0

Ho trovato un trucco se si utilizza jQuery è possibile registrare un ascoltatore globale:

prima cosa è necessario dichiarare una variabile globale nello script principale:

var globalVariableForSelenium = ""; 

Nella tua selenio si registra l'ascoltatore :

if (driver instanceof JavascriptExecutor) { 
       ((JavascriptExecutor) driver) 
       .executeScript("$(document).ajaxSuccess(function(event, xhr, settings) { globalVariableForSelenium = settings.headers });"); 
      } 

Poi si esegue la vostra azione

Finalmente si ottiene il valore della variabile globale:

if (driver instanceof JavascriptExecutor) { 
      Object res = ((JavascriptExecutor) driver) 
      .executeScript("return serializeGlobalvariable();"); 

} 

serializeGlobalvariable() è una funzione che serializzare globalVariableForSelenium che contiene una matrice di intestazione.

ps: il mio bisogno era quello di accedere alla risposta ajax così ho impostato la variabile globale con xhr.responseJSON.mypath

1

Mi rendo conto che questa domanda è vecchia come l'inferno, ma ho sviluppato un modo per farlo questo per firefox + selenio modificando webdriver.xpi e creando il driver.http_logger.variousLogMethods(). Per favore rispondi a questo post se c'è interesse in questo, e posso postare il codice su github.

+0

Sono interessato. Per favore pubblica il link github. –

+0

@ user2426679 Sono anche interessato, potresti mostrarmi su Github come eseguirlo? – David542

+0

@ David542 - Sono finalmente riuscito a caricare questo piccolo progetto. L'ho fatto un po 'di tempo fa, quindi la documentazione è scarsa. https://bitbucket.org/stbrownlow/seleniumwithfirefoxhttplogging/src – user2426679

1

Puoi farlo iniettando una XMLHttpRequest e di attesa per il risultato:

Object response = ((JavascriptExecutor) driver).executeAsyncScript(
     "var callback = arguments[arguments.length - 1];" + 
     "var xhr = new XMLHttpRequest();" + 
     "xhr.open('GET', '/resource/data.json', true);" + 
     "xhr.onreadystatechange = function() {" + 
     " if (xhr.readyState == 4) {" + 
     " callback(xhr.getResponseHeader());" + 
     " }" + 
     "};" + 
     "xhr.send();"); 
    JsonObject json = new JsonParser().parse((String) response); 
    assertEquals("cheese", json.get("food").getAsString()); 

è possibile modificare il callback XHR per ottenere quello che vuoi.