27

पर अजगर से सेलेनियम से फ़ायरफ़ॉक्स को कॉल करने में असमर्थ मैं जावास्क्रिप्ट के साथ कुछ गतिशीलता पृष्ठों को स्क्रैप करने के लिए अजगर से सेलेनियम का उपयोग करने की कोशिश कर रहा हूं। हालांकि, मैं pypi पेज (http://pypi.python.org/pypi/selenium) पर सेलेनियम के निर्देशों का पालन करने के बाद फ़ायरफ़ॉक्स को कॉल नहीं कर सकता। मैंने एडब्ल्यूएस उबंटू 12.04 पर फ़ायरफ़ॉक्स स्थापित किया। त्रुटि संदेश मुझे मिल गया है:एडब्ल्यूएस मशीन

In [1]: from selenium import webdriver 

In [2]: br = webdriver.Firefox() 
--------------------------------------------------------------------------- 
WebDriverException      Traceback (most recent call last) 
/home/ubuntu/<ipython-input-2-d6a5d754ea44> in <module>() 
----> 1 br = webdriver.Firefox() 

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.pyc in __init__(self, firefox_profile, firefox_binary, timeout) 
    49   RemoteWebDriver.__init__(self, 
    50    command_executor=ExtensionConnection("127.0.0.1", self.profile, 
---> 51    self.binary, timeout), 
    52    desired_capabilities=DesiredCapabilities.FIREFOX) 
    53 

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/extension_connection.pyc in __init__(self, host, firefox_profile, firefox_binary, timeout) 
    45   self.profile.add_extension() 
    46 
---> 47   self.binary.launch_browser(self.profile) 
    48   _URL = "http://%s:%d/hub" % (HOST, PORT) 
    49   RemoteConnection.__init__(

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in launch_browser(self, profile) 
    42 
    43   self._start_from_profile_path(self.profile.path) 
---> 44   self._wait_until_connectable() 
    45 
    46  def kill(self): 

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in _wait_until_connectable(self) 
    79     raise WebDriverException("The browser appears to have exited " 
    80      "before we could connect. The output was: %s" % 
---> 81      self._get_firefox_output()) 
    82    if count == 30: 
    83     self.kill() 

WebDriverException: Message: 'The browser appears to have exited before we could connect. The output was: Error: no display specified\n' 

मैं वेब पर खोज की है और पाया है कि इस समस्या को अन्य लोगों के साथ हुआ (https://groups.google.com/forum/?fromgroups=#!topic/selenium -उपयोगकर्ताओं/21sJrOJULZY)। लेकिन अगर समाधान है, तो मैं समाधान को समझ नहीं पा रहा हूं।

क्या कोई मेरी मदद कर सकता है? धन्यवाद!

+4

'त्रुटि: निर्दिष्ट डिस्प्ले 'का अर्थ यह नहीं है कि ब्राउज़र में इसकी मुख्य विंडो प्रदर्शित करने के लिए स्क्रीन नहीं है। आपको फ़ायरफ़ॉक्स हेडलेस चलाने का कोई तरीका ढूंढना होगा: http://stackoverflow.com/questions/10060417/python-firefox-headless। यह उत्तर विशेष रूप से उपयोगी दिखता है: http://stackoverflow.com/a/6300672/464744 – Blender

+0

@ ब्लेंडर आपको बहुत धन्यवाद। दूसरे लिंक ने मेरी समस्या हल की। कभी-कभी मुझे Google से समाधान नहीं मिल रहा है अगर मेरे पास मेरे दिमाग में सही कीवर्ड नहीं है। – David

+0

@ ब्लेंडर: किसी पृष्ठ में प्रतिक्रिया के लिए आपको अपने यूआरएल में एंकर कैसे मिला?मुझे पृष्ठों में इस तरह के कोई लिंक नहीं दिखते हैं। –

उत्तर

51

समस्या यह है कि फ़ायरफ़ॉक्स को एक डिस्प्ले की आवश्यकता है। मैंने प्रदर्शन को अनुकरण करने के लिए अपने उदाहरण में pyvirtualdisplay का उपयोग किया है। समाधान है:

from pyvirtualdisplay import Display 
from selenium import webdriver 

display = Display(visible=0, size=(1024, 768)) 
display.start() 

driver= webdriver.Firefox() 
driver.get("http://www.somewebsite.com/") 

<---some code---> 

#driver.close() # Close the current window. 
driver.quit() # Quit the driver and close every associated window. 
display.stop() 

कृपया ध्यान दें कि pyvirtualdisplay निम्नलिखित बैक-एक छोर की आवश्यकता है: Xvfb, Xephyr, Xvnc।

यह आपकी समस्या का समाधान करना चाहिए।

+0

धन्यवाद। एक त्वरित सवाल: driver.close() और driver.quite() के बीच क्या अंतर है? – David

+1

भविष्य में लोगों की मदद करने के लिए जो इस पर ठोकर खा रहे हैं .. कृपया ध्यान दें कि @ That1Guy से नज़दीक/बाहर निकलने वाली टिप्पणी सिर्फ सादा गलत है। यह भी ध्यान दें कि उसके उत्तर में कोड अंतर्निहित ड्राइवर को सही ढंग से बंद नहीं करता है और प्रक्रियाओं को रिसाव कर सकता है या वर्णनकर्ताओं को फाइल कर सकता है। 'driver.close()' बस वर्तमान विंडो बंद कर देता है। यह अन्य खिड़कियां खुल जाएगा और चालक सक्रिय होगा। 'driver.quit()' वास्तव में ड्राइवर को छोड़ देता है और प्रत्येक संबंधित विंडो को बंद करता है। यदि आप अंतर के बारे में अधिक जानकारी चाहते हैं, तो कृपया सेलेनियम वेबड्राइवर स्रोत कोड पढ़ें। –

+1

भावी पाठकों के लिए एक नोट: टिप्पणी @ कोरीगोल्डबर्ग वास्तव में गलत है। मैंने न केवल उन तरीकों को भ्रमित कर दिया जो मैंने सेलेनियम का जिक्र करते हुए उल्लेख किया था, लेकिन उस समय एक और परियोजना के साथ मैं उस समय काम कर रहा था। कृपया ['driver.quit()'] (http://selenium-python.readthedocs.org/api.html?highlight=driver.quit#selenium.webdriver.firefox.webdriver.WebDriver.quit) के लिए प्रलेखन देखें। और ['drver.close()'] (http://selenium-python.readthedocs.org/api.html?highlight=driver.close#selenium.webdriver.remote.webdriver.WebDriver.close)। – That1Guy

4

मुझे भी एक ही समस्या का सामना करना पड़ा था। मैं फ़ायरफ़ॉक्स 47 और सेलेनियम 2.53 पर था। तो मैंने जो किया वह फ़ायरफ़ॉक्स को 45 तक घटा दिया गया। यह काम किया।

1) निकालें फ़ायरफ़ॉक्स 47 पहले:

sudo apt-get purge firefox

2) उपलब्ध संस्करणों के लिए जाँच करें:

apt-cache show firefox | grep Version

ऐसा लगता है कि उपलब्ध फ़ायरफ़ॉक्स संस्करणों दिखाएगा:

Version: 47.0+build3-0ubuntu0.16.04.1

Version: 45.0.2+build1-0ubuntu1

3) बताओ जो

sudo apt-get install firefox=45.0.2+build1-0ubuntu1

4 डाउनलोड करने के लिए निर्माण) इसके बाद आप फिर से नए संस्करण में अपग्रेड नहीं किया है।

sudo apt-mark hold firefox

5) यदि आप बाद में

sudo apt-mark unhold firefox sudo apt-get upgrade

आशा इस मदद करता है उन्नत करने के लिए चाहते हैं।