2014-12-05 9 views
27

के साथ काम नहीं करता है, मैंने फ़ायरफ़ॉक्स में कुछ स्रोत कोड संशोधन किए हैं और इसे स्वयं बनाते हैं। परीक्षण स्वचालित करने के लिए, मैंने सेलेनियम का उपयोग करने का विकल्प चुना लेकिन दुर्भाग्य से, मेरा नया निर्मित फ़ायरफ़ॉक्स सेलेनियम का समर्थन नहीं करता है।फ़ायरफ़ॉक्स बिल्ड मेरे शोध के लिए सेलेनियम

मैं निम्नलिखित किया:

from selenium import webdriver 
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 

binary = FirefoxBinary("/path/to/firefox/binary") 

d = webdriver.Firefox(firefox_binary=binary) 

d.get("http://www.google.de") 

Firefox मुक्त करता है और उत्तरदायी है (मैं खोज पट्टी में वेबसाइट दर्ज कर सकते हैं)। लेकिन कुछ समय के बाद, अजगर स्क्रिप्ट निम्नलिखित त्रुटि संदेश के साथ दुर्घटनाओं:

Traceback (most recent call last): 
    File "firefox.py", line 7, in <module> 
    d = webdriver.Firefox(firefox_binary=binary) 
    File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/firefox/webdriver.py", line 59, in __init__ 
    self.binary, timeout), 
    File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/firefox/extension_connection.py", line 47, in __init__ 
    self.binary.launch_browser(self.profile) 
    File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 66, in launch_browser 
    self._wait_until_connectable() 
    File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 109, in _wait_until_connectable 
    raise WebDriverException("Can't load the profile. Profile " 
selenium.common.exceptions.WebDriverException: Message: Can't load the profile. Profile Dir: %s If you specified a log_file in the FirefoxBinary constructor, check it for details. 

मुझे लगता है कि त्रुटि संदेश गूगल किया था और सबसे समाधान का सुझाव दिया, कि मैं के बाद से यह प्रयोग किया जाता Firefox संस्करण का समर्थन नहीं करता सेलेनियम अद्यतन करना चाहिए। दुर्भाग्यवश, मैंने सेलेनियम (2.44.0) का नवीनतम संस्करण स्थापित किया और मैंने उस बिंदु को रद्द करने के लिए फ़ायरफ़ॉक्स (संस्करण 33) का एक पुराना संस्करण भी उपयोग किया।

मैंने यह भी सुनिश्चित किया कि मेरे कोड संशोधनों का कारण स्वच्छ, अनमोडिफाइड फ़ायरफ़ॉक्स के निर्माण से दुर्घटनाग्रस्त होने का कारण नहीं है। सेलेनियम या तो इस फ़ायरफ़ॉक्स के साथ काम नहीं करता है।

यदि मैं फ़ायरफ़ॉक्स बाइनरी निर्दिष्ट नहीं करता हूं और सेलेनियम स्थापित फ़ायरफ़ॉक्स का उपयोग करने देता हूं, तो सब कुछ ठीक काम करता है। तो मेरा अनुमान है कि फ़ायरफ़ॉक्स बिल्ड के साथ कुछ गड़बड़ है, जिसे मैंने ऑनलाइन दस्तावेज (उदा ./mach बिल्ड) में बिल्कुल बताया है।

क्या किसी को कोई विचार है, मेरी गलती क्या हो सकती है? कोई भी मदद बहुत ही सराहनीय होगी!

कुछ सेटअप जानकारी:

  • फ़ायरफ़ॉक्स 33
  • सेलेनियम 2.44.0
  • अजगर 3.4 (भी करने की कोशिश की 2.7, या तो काम नहीं करता है)
  • फ़ायरफ़ॉक्स Ubuntu 14.04 के साथ
निर्माण
+0

यह एक छिटपुट मुद्दे या संगत है? मैं इसे भी देख रहा हूं, लेकिन केवल कभी-कभी (एफएफ 34, सेलेनियम 2.44.0, पायथन 2.7, उबंटू 12.04)। मुझे यह अजीब लगता है कि यह आपके मध्य-स्क्रिप्ट के साथ हो रहा है। ध्यान दें कि डिफ़ॉल्ट प्रोफ़ाइल/tmp निर्देशिका में सहेजी जाती है जबतक कि आप कोई नया निर्दिष्ट नहीं करते हैं, इसलिए सुनिश्चित करें कि आपके पास कोई स्क्रिप्ट या कुछ भी नहीं है जो प्रोफ़ाइल को हटा सकता है। – Justin

उत्तर

11

मैंने इसे लंबे समय से डिबग करने में व्यतीत किया है और आखिरकार सेलेनियम/फ़ायरफ़ॉक्स कार्य के असंगत संस्करणों को बनाने की कोशिश कर दिया है। मेरे पास फ़ायरफ़ॉक्स में आगे जाने के लिए विशेषज्ञता नहीं है। मेरी सिफारिश https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/ से स्थिर संस्करणों को डाउनलोड कर रही है और आपके पर्यावरण के लिए काम करने वाले फ़ायरफ़ॉक्स/सेलेनियम के संयोजनों को आजमाएं। मेरे लिए, यह है:

फ़ायरफ़ॉक्स == 32.0.3 सेलेनियम == 2.43.0

मैं बदलाव का यहाँ की चर्चा करते हुए हूँ: http://selenium.googlecode.com/git/java/CHANGELOG जो संस्करणों माना जाता है कि संगत कर रहे हैं देखने के लिए।

असल में, क्या हो रहा है वेबड्राइवर अपने बंदरगाह पर मतदान कर रहा है जब तक कि यह सॉकेट कनेक्शन स्थापित नहीं कर लेता है।

def _wait_until_connectable(self): 
    """Blocks until the extension is connectable in the firefox.""" 
    count = 0 
    while not utils.is_connectable(self.profile.port): 
     if self.process.poll() is not None: 
      # Browser has exited 
      raise WebDriverException("The browser appears to have exited " 
        "before we could connect. If you specified a log_file in " 
        "the FirefoxBinary constructor, check it for details.") 
     if count == 30: 
      self.kill() 
      raise WebDriverException("Can't load the profile. Profile " 
        "Dir: %s If you specified a log_file in the " 
        "FirefoxBinary constructor, check it for details.") 
     count += 1 
     time.sleep(1) 
    return True 

और फिर यदि कोई सॉकेट त्रुटि है, तो जारी रखें। तो आप शायद जो देख रहे हैं (कम से कम मैं क्या हूं) ब्राउज़र 30 सेकंड के लिए लटक रहा है।

def is_connectable(port): 
    """ 
    Tries to connect to the server at port to see if it is running. 

    :Args: 
    - port: The port to connect. 
    """ 
    try: 
     socket_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     socket_.settimeout(1) 
     socket_.connect(("127.0.0.1", port)) 
     socket_.close() 
     return True 
    except socket.error: 
     return False 

ब्लेह। ठीक है, ठीक है, मैंने आखिरकार बस उस विशिष्ट संस्करण को स्टोर करने का फैसला किया जो मैं चाहता हूं और संगत सेलेनियम संस्करण पर स्विच करें।

bin_dir = os.path.join(const.WEBDRIVER_DIR, 'firefox', 'binary', '32.0.3', 'linux-x86_64', 'firefox') 
binary = FirefoxBinary(firefox_path=bin_dir) 
driver = webdriver.Firefox(firefox_binary=binary) 

मैं भी फ़ायरफ़ॉक्स बाइनरी में लॉग फ़ाइल जोड़ने और उसे जांचने की अत्यधिक अनुशंसा करता हूं। आपकी समस्या अनूठी हो सकती है और वहां कोई विचित्र त्रुटियां लॉग हो जाएंगी:

log_dir = os.path.join(const.LOGS_DIR, 'firefox') 
    try: 
    os.makedirs(directory) 
except OSError, e: 
    if e.errno == errno.EEXIST and os.path.isdir(directory): 
     pass 
log_path = os.path.join(log_dir, '{}.log'.format(datetime.datetime.now().isoformat('_')) 
log_file = open(log_path, 'w') 
binary = FirefoxBinary(firefox_path=bin_dir, log_file=log_file) 
+0

आपके लिए समय के लिए धन्यवाद। इस समस्या को डीबग करते समय, मैं आपके जैसा ही बिंदु पर आया था। काफी अजीब, फ़ायरफ़ॉक्स के स्थिर संस्करण एक आकर्षण की तरह काम करते हैं। दुर्भाग्यवश, मैं स्थिर संस्करणों का उपयोग नहीं कर सकता, क्योंकि मैंने फ़ायरफ़ॉक्स कोड में कुछ कोड संशोधन किए हैं। इसलिए मुझे नहीं पता कि एक स्थिर संस्करण क्यों काम कर रहा है, लेकिन मेरा स्वयं निर्मित संस्करण नहीं है। फिर भी, आपके प्रयास के लिए thx! –

-2

मुझे एफएफ 36.0 के साथ एक ही समस्या का सामना करना पड़ा।

मैं आपको cmd 'pip install -U सेलेनियम' के साथ नवीनतम संस्करण में सेलेनियम पैकेज अपडेट करने की सलाह देता हूं।

36

उबंटू 14.04, फ़ायरफ़ॉक्स 36.0, सेलेनियम 2.44.0। एक ही समस्या, द्वारा हल किया गया था:

sudo pip install -U selenium 

सेलेनियम 2.45.0 FF36 के साथ ठीक है।

अद्यतन: सेलेनियम 2.53+ आप पुराने एफएफ संस्करणों here

+2

अद्यतन टिप्पणी में मदद मिली! धन्यवाद :) –

+0

यह अगला कदम होना चाहिए: http://linuxg.net/how-to-install-firefox-36-on-linux-systems/ यह मेरे लिए काम करता है, धन्यवाद – nono

+1

इतनी निराशा के बाद यह केवल एकमात्र है मैच जो मैक ओएस और पायथन 3.5 – thecheech

4

यह एक ही मुद्दे पर एक घंटे बिताया प्राप्त कर सकते हैं FF45

साथ संगत है। पायथन 3 के लिए pip3 याद रखें, अन्यथा यह केवल पायथन 2 पर सेलेनियम को अपग्रेड करेगा, और आपको आश्चर्य होगा कि यह अभी भी क्यों काम नहीं कर रहा है।

sudo pip3 install -U selenium

1

अल Capitan के लिए, निम्न तय:

brew install python

तो

sudo pip install --upgrade selenium

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