2012-03-06 13 views
7

कभी कभी, मेरी स्क्रिप्ट के बीच में, मेरे webdriver उदाहरण सिर्फ मर जाएगा!अजगर सेलेनियम webdriver - चालक अचानक "मर जाता है" और छोड़ नहीं कर सकते, current_url मिलता है, खुले पृष्ठों

और इसके बाद से, मैं इसके किसी भी तरीके का आह्वान नहीं कर सकता।

कुछ उदाहरण:

>>> spsel.driver.current_url 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 414, in current_url 
    return self.execute(Command.GET_CURRENT_URL)['value'] 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 151, in execute 
    response = self.command_executor.execute(driver_command, params) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/remote_connection.py", line 280, in execute 
    return self._request(url, method=command_info[0], data=data) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/remote_connection.py", line 321, in _request 
    response = opener.open(request) 
    File "/usr/lib/python2.6/urllib2.py", line 391, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.6/urllib2.py", line 409, in _open 
    '_open', req) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [Errno 111] Connection refused> 



>>> spsel.driver.quit() 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 55, in quit 
    RemoteWebDriver.quit(self) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 443, in quit 
    self.execute(Command.QUIT) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 151, in execute 
    response = self.command_executor.execute(driver_command, params) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/remote_connection.py", line 280, in execute 
    return self._request(url, method=command_info[0], data=data) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/remote_connection.py", line 321, in _request 
    response = opener.open(request) 
    File "/usr/lib/python2.6/urllib2.py", line 391, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.6/urllib2.py", line 409, in _open 
    '_open', req) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [Errno 111] Connection refused> 

कोई भी विचार क्यों इस मामले हो सकता है? पर काबू पाने के लिए कोई भी सर्वोत्तम अभ्यास समाधान?

मैं कभी कभी एक कोशिश ब्लॉक में driver.current_url से जीवंतता के लिए परीक्षण के बारे में सोच रहा हूँ, और अगर यह एक अपवाद फेंकता है, तो None के लिए ड्राइवर की स्थापना, और फिर इसे फिर से instantiating ... लेकिन यह एक बदसूरत हैक है और मैं समझ में नहीं आता क्यों इसकी आवश्यकता है।

+0

इसे और अधिक समझ बनाने के वेब सर्वर के कोड को देखने के लिए होता है कि इस कोड द्वारा जाँच की जानी चाहिए:

इस अंतिम परिणाम कैसा दिखाई देता है है। "कनेक्शन से इंकार कर दिया गया" स्पष्ट रूप से बताता है कि अब कोई भी नहीं सुन रहा है, या ऐसा कोई नियम है जो श्रोता को शामिल होने से रोकता है ... –

+0

बैकएंड इंजीनियरिंग विभाग के अनुसार, वेब सर्वर ठीक है और स्वचालित रूप से उपयोगकर्ताओं को डिस्कनेक्ट नहीं करता है । मुझे लगता है कि यह एक सेलेनियम बग है? –

+0

आपका सेलेनियम संस्करण क्या है? क्या ब्राउज़र? क्या यह सभी ब्राउज़रों के साथ होता है? क्या आप प्रॉक्सी के पीछे हैं? क्या आपका यूआरएल सही ढंग से बनाया गया है? – nilesh

उत्तर

1

सेलेनियम ड्राइवरों और एफएफ एक्सटेंशन के साथ अंतहीन संघर्ष के बाद। मैंने इसे पूरी तरह से हटा दिया है।

मैं http://www.phantomjs.org/ का उपयोग करता हूं जो हेडलेस जेएस लिब है। आकर्षण की तरह काम करता है। (और मैं तुम्हें पेज देखना चाहते हैं, आप स्क्रीन शूट कर सकते हैं)

मैं मुख्य रूप से गहरे लाल रंग का में काम करते हैं तो: poltergeist के साथ capybara-वेबकिट

मैं (जो सिर्फ capybara के लिए एक js_driver है) की जगह है मुझे यकीन है कि इसी तरह का समाधान होगा। हो सकता है कि यह आपके प्रश्न का उत्तर न दे, लेकिन यह जेएस परीक्षण के बारे में एक अलग रूप प्रदान करेगा।

+3

lol हमें फ़ैंटॉमजेएस के साथ यह समस्या हो रही है, लेकिन हमने जो किया है, हम सिर्फ यह जांचते हैं कि क्या वेबड्राइवर प्रतिक्रिया नहीं दे रहा है अगर हम इसे मार नहीं सकते हैं और एक नया शुरू कर सकते हैं। अब तक महान काम करता है! –

+0

क्या आप यह करने के लिए किए गए चरणों का विस्तार कर सकते हैं? मैं किस प्रक्रिया को – KJW

+0

@ सैमतोटेलिंग देख रहा हूं कि आप कैसे जांचते हैं कि कोई वेबड्राइवर प्रतिसाद नहीं दे रहा है या नहीं? – pad

0

क्या आपके पास सेलेनियम वेबसर्वर पहले चल रहा है?

यह सवाल पता चलता है कि वेब सर्वर नहीं चल समस्या है: Selenium in Python

 
then the solution is most likely that you need get the selenium server running first. 

In the download for SeleniumRC you will find a file called selenium-server.jar (as of a 
few months ago, that file was located at SeleniumRC/selenium-server-1.0.3/selenium- 
server.jar). 

On Linux, you could run the selenium server in the background with the command 

java -jar /path/to/selenium-server.jar 2>/dev/null 1>&2 & 

आप कैसे सर्वर यहाँ http://seleniumhq.org/docs/05_selenium_rc.html#installation

यह पृष्ठ एक ऐसी ही समस्या है स्थापित करने के लिए के बारे में अधिक पूर्ण निर्देशों मिलेगा: http://johnmudd.infogami.com/blog/5be6

एक और इसी तरह के प्रश्न: How do you connect remotely using Python + Webdriver

+1

यह मुद्दा नहीं है। मुझे सेलेनियम सर्वर चलने की आवश्यकता नहीं है क्योंकि मैं वेबड्राइवर के साथ सेलेनियम 2 का उपयोग कर रहा हूं। ऐसा कहकर, मैंने पृष्ठभूमि में वेबसर्वर रखने वाली स्क्रिप्ट शुरू करने का प्रयास किया, और यह मेरी समस्या को ठीक नहीं किया। –

0

तो यह फ़ायरफ़ॉक्स में आपके सेलेनियम वेब ड्राइवर को "कनेक्शन से इनकार कर दिया गया" त्रुटि है जिसे फ़ायरफ़ॉक्स एक्सटेंशन के रूप में कार्यान्वित किया गया है। जंगली अनुमान यहां विस्तार के भीतर कुछ मुद्दा है या फ़ायरफ़ॉक्स विस्तार से httpd कोड को काम करने से रोकता है।

आप यह जांचने का प्रयास कर सकते हैं कि आपके पास नवीनतम web driver extension और एक संगत फ़ायरफ़ॉक्स संस्करण है या नहीं।

और आप कुछ वैकल्पिक ब्राउज़र को भी आजमा सकते हैं क्रोम वेब चालक (इसे आपके पायथन कोड में कुछ पंक्तियों की आवश्यकता है)

0

मुझे एक ही समस्या का अनुभव हुआ, या कम से कम मुझे ऐसा लगता है। मेरी तरफ ब्राउज़र (क्रोम) ब्लॉक होगा और टर्मिनल में प्रक्रिया को मैन्युअल रूप से रोकते समय मुझे एक ही यूआरएलरर मिल जाएगा।

बार मैं Django के LiveServerTestCase के साथ-साथ किरच उपयोग कर रहा था और निम्न विधियों को लागू करने पर:

@classmethod 
def setUpClass(cls): 
    cls.browser = Browser() 
    super(MyClass, cls).setUpClass() 

@classmethod 
def tearDownClass(cls): 
    cls.browser.quit() 
    super(MyClass, cls).tearDownClass() 

यह केवल एक ड्राइवर बन जाएगा सभी परीक्षणों के लिए वर्ग द्वारा भाग गया। मैंने अपने सभी परीक्षणों को सिर्फ एक विधि में रखा है।

वैसे भी इससे किसी बिंदु पर ड्राइवर अवरुद्ध हो जाएगा।

फिर मैंने सेटअप और टियरडाउन विधि को ड्राइवर को तत्काल/छोड़ने के लिए स्विच करने के लिए स्विच किया। इसके बाद कक्षा में प्रत्येक टेस्ट (मेथो) के लिए ड्राइवर बनाया और छोड़ दिया जाएगा। मैंने कई तरीकों से अपने परीक्षण भी तोड़ दिए।

उसके बाद सब ठीक हो जाएगा, जबकि मैं बिल्कुल वही काम कर रहा था। तो यह मुद्दा मुख्य रूप से एक ड्राइवर के साथ सबकुछ कर रहा है।

एक टिप के रूप में, आप लॉगिन विधि को सेटअप विधि में भी कार्यान्वित कर सकते हैं ताकि आपके ड्राइवर प्रत्येक परीक्षण के लिए लॉग इन हो जाएं, यह आवश्यक है क्योंकि ड्राइवर छोड़ने से भी सत्र समाप्त हो जाता है।

from splinter import Browser 
from django.test import LiveServerTestCase 
from django.core.urlresolvers import reverse 

class MySeleniumTests(LiveServerTestCase): 
    fixtures = ['initial_data.json'] 

    def setUp(self): 
     #fire up your driver 
     self.browser = Browser('chrome') 
     #login 
     self.browser.visit('%s%s' % (self.live_server_url, reverse('home'))) 
     self.assertEquals(self.browser.url, '%s%s' % (self.live_server_url,'/accounts/login/?next=%s' % reverse('home'))) 
     self.browser.fill_form({'username': 'test', 'password': 'test'}) 
     self.browser.find_by_tag('button').first.click() 
     self.assertEquals(self.browser.url, '%s%s' % reverse('home'))) 

    def tearDown(self): 
     #quit your driver 
     self.browser.quit() 
संबंधित मुद्दे