2014-09-12 5 views
6

सेलेनियम दस्तावेज के अनुसार, वेबड्राइवर क्लाइंट और ब्राउज़र के बीच बातचीत JSON Wire Protocol के माध्यम से की जाती है। मूल रूप से क्लाइंट, पायथन, रूबी, जावा जो भी लिखा है, वेब ब्राउज़र पर जेएसओएन संदेश भेजता है और वेब ब्राउजर जेएसओएन के साथ भी प्रतिक्रिया देता है।निगरानी जेएसओएन वायर प्रोटोकॉल लॉग

क्या सेलेनियम परीक्षण चलाते समय इन JSON संदेशों को देखने/पकड़ने/लॉग करने का कोई तरीका है?

उदाहरण (अजगर में) के लिए:

from selenium import webdriver 

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

driver.close() 

मैं देखना क्या JSON संदेशों ग्राहक और एक ब्राउज़र webdriver अजगर सेलेनियम के बीच जा रहे हैं जब मैं ड्राइवर का दृष्टांत (इस मामले क्रोम में) हैं: webdriver.Chrome(), जब मुझे एक पृष्ठ मिल रहा है: driver.get('http://google.com') और जब मैं इसे बंद कर रहा हूं: driver.close()

FYI करें, #SFSE: Stripping Down Remote WebDriver ट्यूटोरियल में, यह स्थानीय मशीन जहां स्क्रिप्ट चल रही है और दूरस्थ सेलेनियम सर्वर के बीच नेटवर्क यातायात पर कब्जा करने के माध्यम से किया जाता है।

मैं प्रश्न Python विशिष्ट के रूप में टैग कर रहा हूं, लेकिन वास्तव में किसी भी पॉइंटर्स से खुश होगा।

+0

[सेलेनियम वेबड्राइवर एपीआई दस्तावेज] (http://selenium-python.readthedocs.org/api.html) को देखकर पुस्तकालय का उपयोग करने और इसे JSON साझा करने का कोई सुलभ तरीका प्रतीत नहीं होता है उत्पादन/प्राप्त। मैं शायद नेटवर्क यातायात को पकड़ने की कोशिश करने की ओर झुकना चाहूंगा। – ydaetskcoR

+0

@ydaetskcoR धन्यवाद, यह वही है जो मैं वर्तमान में सोच रहा हूं, हालांकि यह सुनिश्चित नहीं है कि क्या यह करने योग्य है यदि क्लाइंट और वास्तविक ड्राइवर दोनों स्थानीय मशीन पर हैं। यदि अन्य विकल्प हैं तो समुदाय से पूछने का फैसला किया। – alecxe

+0

यह शायद गलत दृष्टिकोण है लेकिन आप हमेशा एक वीएम स्पिन कर सकते हैं और उस पर सेलेनियम सर्वर डाल सकते हैं ताकि आप वर्चुअल नेटवर्क परत पर नेटवर्क यातायात को कैप्चर कर सकें। – ydaetskcoR

उत्तर

4

जब आप क्रोम का उपयोग करते हैं तो आप chromedriver उदाहरण को निर्देशित कर सकते हैं जो क्रोम को logging पैकेज के माध्यम से उपलब्ध जानकारी से अधिक जानकारी लॉग करने के लिए ड्राइव करेगा। इस जानकारी में ब्राउज़र को भेजे गए आदेश और प्रतिक्रियाएं शामिल हैं।

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

इच्छा उत्पादन उपरोक्त कोड लॉग /tmp/log करने के लिए: यहाँ एक उदाहरण है। लॉग find_element_... कॉल से मेल खाती है का हिस्सा इस तरह दिखता है:

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

जहाँ तक मुझे पता है, आदेश और प्रतिक्रियाओं ईमानदारी से प्रतिनिधित्व करते हैं क्या क्लाइंट और सर्वर के बीच चल रहा है। मैंने इन लॉग में जो देखा, उसके आधार पर सेलेनियम प्रोजेक्ट में बग रिपोर्ट और फिक्सेस जमा कर दिए हैं।

+0

यह वास्तव में कुछ है जिसके बारे में मैंने पढ़ा है लेकिन उपयोग नहीं किया है, वास्तव में जानकारीपूर्ण दिखता है। हालांकि, यह क्रोम-विशिष्ट है, लेकिन ड्राइवर http अनुरोधों से आउटगोइंग लॉगिंग के संयोजन के बाद, आप लगभग पहेली की पूरी तस्वीर देख सकते हैं। आपका बहुत बहुत धन्यवाद। – alecxe

+0

@alecxe उपहार के लिए धन्यवाद! खुशी है कि आपने जवाब की सराहना की। – Louis

4

एक विकल्प मिला जो लगभग मेरी आवश्यकताओं के अनुरूप है।

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

यह प्रिंट:

बस stdout को लकड़हारा पाइप देखने के लिए अंतर्निहित अनुरोध किया जा रहा है की अनुमति देता है

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 

मैं प्रतिक्रियाओं नहीं दिख रहा है, लेकिन यह पहले से ही एक प्रगति है ।

+0

यह काफी साफ विचार है। क्या आप urllib2 के बजाय अनुरोधों के साथ कुछ ऐसा कर सकते हैं? यह थोड़ा और उपयोगी – ydaetskcoR

+0

@ydaetskcoR अच्छी तरह से होता है, सेलेनियम [हुड के नीचे 'urllib2' का उपयोग करता है] (https://code.google.com/p/selenium/source/browse/py/selenium/webdriver/remote/ remote_connection.py) (Python2.x पर), इसलिए, 'अनुरोध' के लिए इसे बनाने की कोई आवश्यकता नहीं है। साथ ही, डिबगलेवल को सेट करने की आवश्यकता नहीं थी, क्योंकि ऐसा प्रतीत होता है कि सेलेनियम 'डीबग' स्तर के अनुरोधों को लॉग करता है। उचित लॉग स्तर बस सेट करना पर्याप्त है। धन्यवाद। – alecxe

+0

क्या आप प्रतिक्रिया प्राप्त करने में सफल रहे हैं? –

संबंधित मुद्दे