2014-09-12 17 views
6

In base alla documentazione sul selenio, le interazioni tra il client webdriver e un browser vengono effettuate tramite JSON Wire Protocol. Fondamentalmente il client, scritto in python, ruby, java any, invia messaggi JSON al browser web e anche il browser web risponde con JSON.Monitoraggio dei registri del protocollo JSON

C'è un modo per visualizzare/catturare/registrare questi messaggi JSON mentre si esegue un test del selenio?

Per esempio (in Python):

from selenium import webdriver 

driver = webdriver.Chrome() 
driver.get('http://google.com') 

driver.close() 

voglio vedere quali messaggi JSON stanno tra il selenio pitone WebDriver client e un browser quando ho istanziare il driver (in questo caso Chrome): webdriver.Chrome(), quando ottengo una pagina: driver.get('http://google.com') e quando la sto chiudendo: driver.close().

FYI, nel #SFSE: Stripping Down Remote WebDriver esercitazione, è stata fatta tramite catturare il traffico di rete tra la macchina locale in cui lo script è in esecuzione e il server di selenio distanza.

Sto taggando la domanda come Python specifica, ma sarei davvero felice con qualsiasi suggerimento.

+0

Guardando la [documentazione API Selenium Webdriver] (http://selenium-python.readthedocs.org/api.html) non sembra esserci alcun modo accessibile di usare la libreria e di averla condivisa con il JSON generando/ricezione. Probabilmente mi piacerebbe anche tentare di catturare il traffico di rete. – ydaetskcoR

+0

@ydaetskcoR grazie, questo è quello a cui sto pensando attualmente, anche se non sono sicuro che sia fattibile se il client e il driver attuale sono sul computer locale. Ho deciso di chiedere alla comunità se ci sono altre opzioni. – alecxe

+0

Probabilmente è l'approccio sbagliato, ma è sempre possibile avviare una VM e inserire un server di selenio su di esso in modo da poter acquisire il traffico di rete sul livello di rete virtuale. – ydaetskcoR

risposta

4

Quando si utilizza Chrome è possibile indirizzare l'istanza chromedriver che guiderà Chrome per registrare più informazioni rispetto a quelle disponibili tramite il pacchetto logging. Queste informazioni includono i comandi inviati al browser e le risposte che ottiene. Ecco un esempio:

from selenium import webdriver 

driver = webdriver.Chrome(service_log_path="/tmp/log") 
driver.get("http://www.google.com") 
driver.find_element_by_css_selector("input") 
driver.quit() 

Il seguente output il registro per /tmp/log. La parte del registro che corrisponde alla chiamata find_element_... simile a questo:

[2.389][INFO]: COMMAND FindElement { 
    "sessionId": "b6707ee92a3261e1dc33a53514490663", 
    "using": "css selector", 
    "value": "input" 
} 
[2.389][INFO]: Waiting for pending navigations... 
[2.389][INFO]: Done waiting for pending navigations 
[2.398][INFO]: Waiting for pending navigations... 
[2.398][INFO]: Done waiting for pending navigations 
[2.398][INFO]: RESPONSE FindElement { 
    "ELEMENT": "0.3367185448296368-1" 
} 

Per quanto ne so, i comandi e le risposte rappresenti fedelmente ciò che sta succedendo tra il client e il server. Ho inviato segnalazioni di bug e correzioni al progetto Selenium sulla base di ciò che ho visto in questi log.

+0

Questo è qualcosa che ho letto ma che non ho usato, sembra davvero informativo. Tuttavia, questo è specifico per il cromo, ma dopo aver combinato la registrazione in uscita dalle richieste HTTP del driver, puoi quasi vedere l'intera immagine del puzzle. Grazie mille. – alecxe

+0

@alecxe Grazie per la taglia! Sono contento che tu abbia apprezzato la risposta. – Louis

4

Trovato un'opzione che si adatta alle mie esigenze.

Proprio tubazioni lo strumento al stdout permette di vedere le richieste sottostanti stati fatti:

import logging 
import sys 

from selenium import webdriver 


# pipe logs to stdout 
logger = logging.getLogger() 
logger.addHandler(logging.StreamHandler(sys.stdout)) 
logger.setLevel(logging.NOTSET) 

# selenium specific code 
driver = webdriver.Chrome() 
driver.get('http://google.com') 

driver.close() 

Esso stampa:

POST http://127.0.0.1:56668/session {"desiredCapabilities": {"platform": "ANY", "browserName": "chrome", "version": "", "javascriptEnabled": true, "chromeOptions": {"args": [], "extensions": []}}} 
Finished Request 
POST http://127.0.0.1:56668/session/5b6875595143b0b9993ed4f66f1f19fc/url {"url": "http://google.com", "sessionId": "5b6875595143b0b9993ed4f66f1f19fc"} 
Finished Request 
DELETE http://127.0.0.1:56668/session/5b6875595143b0b9993ed4f66f1f19fc/window {"sessionId": "5b6875595143b0b9993ed4f66f1f19fc"} 
Finished Request 

non vedo le risposte, ma questo è già un progresso .

+0

Questa è un'idea abbastanza carina. Potresti fare qualcosa di simile con le richieste invece di urllib2? Tende ad essere un po 'più utile – ydaetskcoR

+0

@ydaetskcoR bene, selenio [usa 'urllib2' sotto il cofano] (https://code.google.com/p/selenium/source/browse/py/selenium/webdriver/remote/ remote_connection.py) (su Python2.x), quindi non c'è bisogno di fare lo stesso per 'requests'. Inoltre, l'impostazione di debuglevel non era necessaria, dal momento che sembra che il selenio registri le richieste con il livello 'debug'. È sufficiente impostare il livello di registro appropriato. Grazie. – alecxe

+0

Sei riuscito a ottenere le risposte? –

Problemi correlati