2014-09-12 8 views
6

Zgodnie z dokumentacją selenu interakcje między klientem webdriver a przeglądarką odbywają się za pośrednictwem JSON Wire Protocol. Zasadniczo klient, napisany w python, ruby, java cokolwiek, wysyła komunikaty JSON do przeglądarki internetowej, a przeglądarka odpowiada również JSON.Monitorowanie protokołów protokołu drutu JSON

Czy istnieje sposób wyświetlania/przechwytywania/rejestrowania tych komunikatów JSON podczas uruchamiania testu selenu?

Na przykład (w Pythonie):

from selenium import webdriver 

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

driver.close() 

Chcę zobaczyć, jakie wiadomości JSON idą między selen python webdriver klienta i przeglądarką kiedy instancję sterownika (w tym przypadku Chrome): webdriver.Chrome(), kiedy otrzymuję stronę: driver.get('http://google.com') i kiedy ją zamykam: driver.close().

FYI, w tutorialu #SFSE: Stripping Down Remote WebDriver, że odbywa się to poprzez przechwytywanie ruchu sieciowego pomiędzy maszyną lokalny gdzie skrypt jest uruchomiony i serwerem selenu zdalnego.

Podkreślam konkretne pytanie jako Python, ale naprawdę byłbym zadowolony z wszelkich wskazówek.

+0

Przeglądanie dokumentacji [dokumentacji Selenium Webdriver API] (http://selenium-python.readthedocs.org/api.html) nie wydaje się być żadnym dostępnym sposobem korzystania z biblioteki i udostępnianiem JSON-a generowanie/odbieranie. Prawdopodobnie chciałbym też pochylić się nad przechwytywaniem ruchu sieciowego. – ydaetskcoR

+0

@ydaetskcoR dziękuję, właśnie o tym teraz myślę, choć nie jestem pewien, czy jest to wykonalne, jeśli zarówno klient, jak i aktualny sterownik znajdują się na lokalnym komputerze. Postanowili zapytać społeczność, czy są inne opcje. – alecxe

+0

To prawdopodobnie niewłaściwe podejście, ale zawsze można wyłowić maszynę wirtualną i umieścić na niej serwer selenowy, aby można było przechwytywać ruch sieciowy przez wirtualną warstwę sieciową. – ydaetskcoR

Odpowiedz

4

Korzystając z Chrome, możesz skierować instancję chromedriver, która spowoduje, że Chrome zarejestruje więcej informacji niż ta dostępna w pakiecie logging. Informacje te obejmują polecenia wysyłane do przeglądarki i otrzymywane odpowiedzi. Oto przykład:

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

Powyższy kod wyjścia będzie dziennika /tmp/log. Część dzienniku, który odpowiada na wezwanie find_element_... wygląda następująco:

[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" 
} 

O ile wiem, polecenia i komunikaty wiernie przedstawiają co dzieje się pomiędzy klientem a serwerem. Przesłałem zgłoszenia błędów i poprawki do projektu Selenium na podstawie tego, co zobaczyłem w tych dziennikach.

+0

To jest naprawdę coś, o czym czytałem, ale którego nie używałem, wygląda na naprawdę pouczające. Chociaż jest to zależne od chrome, ale po połączeniu z logowaniem wychodzących z żądań http sterownika, prawie można zobaczyć cały obraz układanki. Dziękuję Ci bardzo. – alecxe

+0

@alecxe Dzięki za nagrodę! Cieszę się, że doceniłeś odpowiedź. – Louis

4

Znaleziono jedną opcję, która prawie pasuje do moich potrzeb.

Wystarczy rurociągów rejestratora do stdout pozwala zobaczyć wnioski bazowe są wykonane:

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

Drukuje:

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 

nie widzę odpowiedzi, ale to już jest postęp .

+0

To całkiem fajny pomysł. Czy możesz zrobić coś podobnego z prośbami zamiast urllib2? To wydaje się być nieco bardziej użyteczne – ydaetskcoR

+0

@ydaetskcoR well, selenium [używa 'urllib2' pod maską] (https://code.google.com/p/selenium/source/browse/py/selenium/webdriver/remote/ remote_connection.py) (na Python2.x), więc nie ma potrzeby, aby zrobić to samo dla 'request'. Ustawienie poziomu debugowania nie było potrzebne, ponieważ wydaje się, że selen loguje żądania z poziomem 'debugowania'. Wystarczy ustawić odpowiedni poziom dziennika. Dzięki. – alecxe

+0

Czy udało Ci się uzyskać odpowiedzi? –

Powiązane problemy