8

我有一個腳本使用了我正在運行的無頭瀏覽器,使用crontab -e。它運行正常第幾次,然後用下面的回溯崩潰:無頭腳本在幾次運行後崩潰

Traceback (most recent call last): 
    File "/home/clint-selenium-firefox.py", line 83, in <module> 
    driver.get(url) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 248, in get 
    self.execute(Command.GET, {'url': url}) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute 
    self.error_handler.check_response(response) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.WebDriverException: Message: Failed to decode response from marionette 

我的crontab行是:

*/10 * * * * export DISPLAY=:0 && python /home/clint-selenium-firefox.py >> /home/error.log 2>&1 

我不想讓我受夠了這種python腳本超負荷此拿出我認爲是相關的部分。

from pyvirtualdisplay import Display 

display = Display(visible=0, size=(800, 600)) 
display.start() 
... 
driver = webdriver.Firefox() 
driver.get(url) 
... 
driver.quit() 
... 
display.stop() 

您的幫助是非常感謝。

編輯

版本:火狐49.0.2;硒:3.0.1; geckodriver:geckodriver-v0.11.1-linux64.tar.gz

左右誤差(上driver.get(url)失敗)代碼:

driver = webdriver.Firefox() 
if DEBUG: print "Opened Firefox" 

for u in urls: 
    list_of_rows = [] 
    list_of_old_rows = [] 

    # get the old version of the site data 
    mycsvfile = u[1] 
    try: 
     with open(mycsvfile, 'r') as csvfile: 
      old_data = csv.reader(csvfile, delimiter=' ', quotechar='|') 
      for o in old_data: 
       list_of_old_rows.append(o) 
    except: pass 

    # get the new data 
    url = u[0] 
    if DEBUG: print url  

    driver.get(url) 
    if DEBUG: print driver.title 
    time.sleep(1) 
    page_source = driver.page_source 
    soup = bs4.BeautifulSoup(page_source,'html.parser') 
+0

我已經做了很多或閱讀此。我需要使用木偶嗎? – HenryM

+0

什麼是您使用的firefox,selenium和geckodriver版本? –

+0

在每種情況下,我正在下載最新版本 – HenryM

回答

6

Multiple Firefox instances failing with NS_ERROR_SOCKET_ADDRESS_IN_USE #99這是因爲沒有--marionette端口選項傳遞給geckodriver - 這意味着geckodriver的所有實例啓動firefox傳遞相同的期望的默認端口(2828)。第一個firefox實例綁定到該端口,未來的實例不能和所有的geckodriver實例最終連接到第一個firefox實例 - 這會產生各種不可預知的行爲。

跟着:我認爲一個合理的短期解決方案是做其他司機正在做的事情,並要求木偶綁定到由geckodriver生成的隨機自由端口。目前它使用2828作爲其產生的所有Firefox實例的默認值。 由於Marionette遺憾的是還沒有將端口傳回給客戶端(geckodriver)的帶外方式,這本質上是活潑的,但我們可以通過來自bug 1240830的提案之一來改進未來的情況。

change

Selenium 3.0.0.b2 
* Updated Marionette port argument to match other drivers. 

做我猜隨機只能這麼久。提高issue。代碼修復可能需要您擁有的硒,firefox和geckodriver版本。您可以放棄使用Selenium 2.53.0和firefox esr 38.8,直到解決問題。你的來電。

UPDATE:嘗試

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

binary = FirefoxBinary('path/to/binary') 
driver = webdriver.Firefox(firefox_binary=binary) 
+0

我正在嘗試返回到早期版本。安裝硒2.53.0很容易,但我努力得到Firefox的ESR 38.8。我想'sudo apt-get install iceweasel',它只是選擇和安裝最新版本的Firefox。你能建議如何強制舊版本。 – HenryM

+0

我已經設法回到你提出的版本,但我現在得到'OSError:[Errno 13] Permission denied' – HenryM

+0

在linux上,我打開了我的google chrome瀏覽器並鍵入https://download.mozilla.org /?product=firefox-38.8.0esr-SSL&os=linux&lang=ach – MikeJRamsey56