2014-09-12 48 views
6

Selenyum belgelerine göre, web tarayıcısı istemcisi ile tarayıcı arasındaki etkileşimler JSON Wire Protocol aracılığıyla gerçekleştirilir. Temel olarak, python, ruby, java ne yazıyorsa, istemci web tarayıcısına JSON mesajlarını gönderir ve web tarayıcısı da JSON ile yanıt verir.JSON kablo protokol günlüklerini izleme

Bir selenyum testi çalıştırırken bu JSON mesajlarını görüntülemenin/yakalamanın/kaydetmenin bir yolu var mı?

(Python) Örneğin:

Ben (bu durumda Krom cinsinden) sürücü örneğini zaman JSON mesajları istemcisi ve bir tarayıcı webdriver piton selenyum arasındaki gidiyoruz görmek istiyorum
from selenium import webdriver 

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

driver.close() 

: webdriver.Chrome(), Bir sayfa aldığımda: driver.get('http://google.com') ve kapattığım zaman: driver.close().

Bilginize, #SFSE: Stripping Down Remote WebDriver eğitimde, bu komut çalıştıran yerel makine ve uzak selenyum sunucusu arasındaki ağ trafiğini yakalama aracılığıyla yapılır.

Sorunu Python olarak etiketledim, ancak gerçekten herhangi bir işaretçi ile mutlu olurdum.

+0

[Selenium Webdriver API dökümantasyonu] 'na (http://selenium-python.readthedocs.org/api.html) bakarak, kütüphaneyi kullanmanın ve JSON'u paylaştığının erişilebilir bir yolu yoktur. üretme/alıcı. Ayrıca, ağ trafiğini yakalamaya çalışmak için muhtemelen eğilmek istiyorum. – ydaetskcoR

+0

@ydaetskcoR Teşekkür ederim, şu anda düşündüğüm şey şu ki, eğer hem istemci hem de gerçek sürücü yerel makinede çalışıyorsa emin olun. Başka seçenekler varsa topluluğa sormaya karar verdim. – alecxe

+0

Muhtemelen yanlış bir yaklaşımdır, ancak bir VM'yi her zaman döndürüp bir selenyum sunucusu yerleştirerek ağ trafiğini sanal ağ katmanı üzerinden yakalayabilirsiniz. – ydaetskcoR

cevap

4

Chrome'u kullandığınızda, logging paketinden ulaşabileceğinizden daha fazla bilgi almak için Chrome'u yönlendiren chromedriver örneğini kullanabilirsiniz. Bu bilgi, tarayıcıya gönderilen komutları ve aldığı yanıtları içerir.

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

irade çıkışı Yukarıdaki kod günlüğü /tmp/log için: İşte bir örnek. find_element_... çağrısına karşılık gelen günlük bir parçası gibi görünür:

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

olarak bildiğim kadarıyla, komutları ve cevapları sadakatle istemci ve sunucu arasında neler olduğunu temsil eder. Bu kayıtlarda gördüklerime dayanarak Selenium projesine hata raporları ve düzeltmeleri gönderdim.

+0

Bu gerçekten okudum ama kullanmadım bir şey, gerçekten bilgilendirici görünüyor. Yine de, bu kroma özgüdür, ancak sürücü http isteklerinden çıkış yapmakla birleştirdikten sonra, bulmacanın tüm resmini neredeyse görebilirsiniz. Çok teşekkür ederim. – alecxe

+0

@alecxe Ödül için teşekkürler! Cevabı takdir etmene sevindim. – Louis

4

Neredeyse gereksinimlerime uyan bir seçenek bulundu.

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

O yazdırır: Sadece stdout için logger boru

yatan istekler yapılıyor görmenizi sağlar ben yanıtları görmüyorum

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 

, ancak bu zaten bir gelişmedir .

+0

Bu oldukça düzgün bir fikir. Urllib2 yerine isteklerle benzer bir şey yapabilir misiniz? O biraz daha yararlı – ydaetskcoR

+0

@ydaetskcoR iyi olma eğilimindedir, selenium [başlık altında urllib2 kullanır] (https://code.google.com/p/selenium/source/browse/py/selenium/webdriver/remote/ remote_connection.py) (Python2.x üzerinde), 'istekleri' için aynı şeyi yapmaya gerek yoktur. Ayrıca, debuglevel ayarının yapılmasına gerek olmadı, çünkü selenyum istekleri 'debug' düzeyiyle günlüğe kaydeder. Sadece uygun günlük seviyesini ayarlamak yeterlidir. Teşekkürler. – alecxe

+0

Yanıtları almayı başardınız mı? –