Ответ 1
Ubuntu 14.04, firefox 36.0, селен 2.44.0. Та же проблема была решена:
sudo pip install -U selenium
Selenium 2.45.0 в порядке с FF36.
: Selenium 2.53+ совместим с FF45
Вы можете получить более старые версии FF здесь
для моих исследований я сделал некоторые модификации исходного кода в 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 действительно работает и реагирует (я могу ввести веб-сайт в панель поиска). Но через некоторое время python script выйдет со следующим сообщением об ошибке:
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.
Я сделал google, что сообщение об ошибке и большинство предлагаемых решений, что я должен обновить Selenium, поскольку он не поддерживает используемую версию Firefox. К сожалению, я установил новейшую версию селена (2.44.0), и я даже использовал более старую версию firefox (версия 33), чтобы исключить эту точку.
Я также убедился, что мои модификации кода не являются причиной для этого, создавая чистый, немодифицированный firefox. Selenium также не работает с этим firefox.
Если я не укажу бинарник firefox и не позволю Selenium использовать установленный Firefox, все будет хорошо. Поэтому я предполагаю, что с сборкой firefox что-то не так, что я сделал точно так, как указано в онлайн-документации (например,./mach build).
Есть ли у кого-нибудь идея, какова моя ошибка? Любая помощь очень ценится!
Некоторые сведения об установке:
Ubuntu 14.04, firefox 36.0, селен 2.44.0. Та же проблема была решена:
sudo pip install -U selenium
Selenium 2.45.0 в порядке с FF36.
: Selenium 2.53+ совместим с FF45
Вы можете получить более старые версии FF здесь
Я долгое время отлаживал это и в конечном итоге отказался от попыток сделать несовместимые версии работы selenium/firefox. У меня просто нет опыта в firefox, чтобы идти дальше. Моя рекомендация заключается в том, что вы загружаете стабильные версии из https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/ и продолжаете попытки сочетания firefox/selenium, которые работают в вашей среде. Для меня это:
светлячок == 32.0.3 Селен == 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
BLEH. Хорошо, я наконец-то решил сохранить конкретную версию, которую я хочу, и переключиться на совместимую версию 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)
Провел час по этой же проблеме. Для Python3 помните pip3
, иначе он будет только обновлять selenium на Python2, и вам останется интересно, почему он все еще не работает.
sudo pip3 install -U selenium
Для Эль-Капитана зафиксировано следующее:
brew install python
затем
sudo pip install --upgrade selenium
У меня была та же проблема с FF 36.0.
Я рекомендую вам обновить пакет selenium до последней версии с помощью cmd 'pip install -U selenium'.