web-dev-qa-db-ja.com

AWSマシンのpythonでSeleniumからFirefoxを呼び出すことができません

pythonからSeleniumを使用して、javascriptで一部のダイナミクスページをこすり取ろうとしています。しかし、pypiページ(http://pypi.python .org/pypi/Selenium)。AWS ubuntu 12.04にfirefoxをインストールしました。取得したエラーメッセージは次のとおりです:

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-users/21sJrOJULZY)で発生していることがわかりました。しかし、私はその解決策を理解していません。

誰かが私を助けてくれますか?ありがとう!

28
David

問題は、Firefoxがディスプレイを必要とすることです。私の例では 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のいずれかのバックエンドが必要であることに注意してください。

これで問題が解決します。

53
That1Guy

私も同じ問題に直面していました。Firefox47とSelenium 2.53を使用していました。だから私がやったことはFirefoxを45にダウングレードすることでした。これはうまくいきました。

1)最初にFirefox 47を削除します。

Sudo apt-get purge firefox

2)利用可能なバージョンを確認します。

apt-cache show firefox | grep Version

次のような使用可能なFirefoxのバージョンが表示されます。

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 firefoxSudo apt-get upgrade

お役に立てれば。

4
Amogh Joshi

これはすでにOPの質問のコメントにありますが、回答としてそれを配置することです。実際のブラウザウィンドウを開かなくても、Seleniumをバックグラウンドで実行できます。

たとえば、Chromeを使用している場合は、次のオプションを設定します。

from Selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.set_headless(headless=True)

次に、Webドライバーを呼び出すと、設定がパラメーターになります。

browser = webdriver.Chrome(chrome_options=chrome_options)
0

Debian 10およびUbuntu 18.04の場合、これは完全な実行例です。

  1. Chromeドライバーを〜/ダウンロードにダウンロード:
    $ wget https://chromedriver.storage.googleapis.com/80.0.3987.16/chromedriver_linux64.Zip

  2. unzip chromedriver_linux64.Zipで解凍します

  3. ファイルを実行可能フォルダに移動します(すでにパスが設定されています)。
    $ Sudo mv chromedriver /usr/local/bin

次に、Jupyterを使用してノートブックで、またはスクリプト内でこのコードを実行します。

from Selenium.webdriver import Chrome
from Selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.set_headless(headless=True)


browser = Chrome(chrome_options=chrome_options)
browser.get('http://www.linkedin.com/')
print(browser.page_source)

これにより、ソースHTML全体がページに印刷されます。

0
f0nzie