web-dev-qa-db-ja.com

FirefoxビルドがSeleniumで機能しない

私の研究のために、Firefoxでソースコードを変更し、自分でビルドしました。テストを自動化するために、私はSeleniumを使用することを選択しましたが、残念ながら、新しくビルドされたFirefoxはSeleniumをサポートしていないようです。

私は次のことをしました:

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が開き、応答します(検索バーにWebサイトを入力できます)。しかし、しばらくすると、pythonスクリプトは次のエラーメッセージでクラッシュします。

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バージョンをサポートしていないため、Seleniumを更新する必要があります。残念ながら、最新バージョンのSelenium(2.44.0)をインストールし、古いバージョンのfirefox(バージョン33)を使用してその点を除外しました。

また、コードの変更が、クリーンで変更されていないFirefoxを構築することによってクラッシュする理由ではないことを確認しました。 Seleniumは、このFirefoxでも動作しません。

Firefoxバイナリを指定せず、SeleniumにインストールされたFirefoxを使用させる場合、すべて正常に動作します。私の推測では、Firefoxビルドに何か問題があると思います。これは、オンラインドキュメント(例:./machビルド)で述べたとおりに行いました。

誰かがアイデアを持っていますか、私の間違いは何ですか?どんな助けも大歓迎です!

いくつかのセットアップ情報:

  • Firefox 33
  • セレン2.44.0
  • Python 3.4(2.7も試しましたが、どちらも動作しません)
  • Ubuntu 14.04を使用したFirefoxビルド
29
Thomas Müller

Ubuntu 14.04、firefox 36.0、Selenium 2.44.0。同じ問題は、次の方法で解決されました。

Sudo pip install -U Selenium

Selenium 2.45.0はFF36で問題ありません。

更新:Selenium 2.53+はFF45と互換性があります

古いFFバージョンを取得できます here

38
zesaver

これをデバッグするのに長い時間を費やし、最終的にSelenium/firefoxの互換性のないバージョンを動作させることをあきらめました。私は、Firefoxの専門知識を持っていません。 https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/ から安定版をダウンロードし、環境に合ったfirefox/Seleniumの組み合わせを試してみることをお勧めします。私にとって、これは:

firefox == 32.0.3 Selenium == 2.43.0

ここで変更ログを参照しています: http://Selenium.googlecode.com/git/Java/CHANGELOG 互換性があると思われるバージョンを確認します。

基本的に、webdriverはソケット接続を確立できるまでポートでポーリングしています。

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

ブレー。申し分なく、私はついに、私が望む特定のバージョンを保存し、互換性のあるSeleniumバージョンに切り替えることにしました。

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)

また、Firefoxバイナリにログファイルを追加してチェックすることを強くお勧めします。あなたの問題はユニークかもしれず、奇妙なエラーはそこに記録されます:

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)
11
Justin

この同じ問題に1時間費やしました。 Python3の場合は、pip3、それ以外の場合は、Python2でのみSeleniumをアップグレードしますが、なぜまだ機能しないのか不思議に思われるでしょう。

Sudo pip3 install -U Selenium

4
MisterRios

El-Capitanの場合、以下が修正されました。

brew install python

それから

Sudo pip install --upgrade Selenium

2
Mesut GÜNEŞ