私の研究のために、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ビルド)で述べたとおりに行いました。
誰かがアイデアを持っていますか、私の間違いは何ですか?どんな助けも大歓迎です!
いくつかのセットアップ情報:
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
これをデバッグするのに長い時間を費やし、最終的に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)
この同じ問題に1時間費やしました。 Python3の場合は、pip3
、それ以外の場合は、Python2でのみSeleniumをアップグレードしますが、なぜまだ機能しないのか不思議に思われるでしょう。
Sudo pip3 install -U Selenium
El-Capitanの場合、以下が修正されました。
brew install python
それから
Sudo pip install --upgrade Selenium