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

あなたの助けに感謝します。

編集

バージョン: Firefox 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')  
4

1 に答える 1

6

複数の Firefox インスタンスが NS_ERROR_SOCKET_ADDRESS_IN_USE #99 で失敗する からこれは、geckodriver に --marionette-port オプションが渡されていないためです。これは、geckodriver のすべてのインスタンスが同じ望ましいデフォルト ポート (2828) を渡して Firefox を起動することを意味します。最初の firefox インスタンスはそのポートにバインドしますが、それ以降のインスタンスはバインドできず、すべての geckodriver インスタンスが最初の firefox インスタンスに接続することになり、あらゆる種類の予測不可能な動作が発生します。

続いて:合理的な短期的な解決策は、他のドライバーが行っていることを行い、マリオネットに geckodriver によって生成されたランダム化された空きポートにバインドするように依頼することだと思います。現在、Firefox から生成されるすべてのインスタンスのデフォルトとして 2828 を使用しています。残念ながら、Marionette はポートをクライアント (geckodriver) に戻すための帯域外の方法をまだ持っていないため、これは本質的に際どいものですが、バグ 1240830 からの提案の 1 つを使用して、将来的に状況を改善することができます。

この変更

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

ランダムは非常に長い間しか機能しないと思います。問題を提起します。お使いの Selenium、firefox、および geckodriver のバージョンでは、コードの修正が必要になる場合があります。これが修正されるまで、Selenium 2.53.0 と firefox esr 38.8 の使用に戻すことができます。あなたの電話。

更新:試してください

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

binary = FirefoxBinary('path/to/binary')
driver = webdriver.Firefox(firefox_binary=binary)
于 2016-11-21T23:07:29.637 に答える