Firefox 更新后无法使用 Selenium 打开浏览器

Posted

技术标签:

【中文标题】Firefox 更新后无法使用 Selenium 打开浏览器【英文标题】:Can't open browser with Selenium after Firefox update 【发布时间】:2016-10-12 05:08:35 【问题描述】:

我在 Ubuntu Desktop 16.04 上使用 Selenium WebDriver,但无法打开浏览器。 Firefox 更新后出现以下错误(在此之前,一切正常):

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    driver = webdriver.Firefox()
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/firefox/webdriver.py", line 81, in __init__
    self.binary, timeout)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/firefox/extension_connection.py", line 51, in __init__
    self.binary.launch_browser(self.profile, timeout=timeout)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 68, in launch_browser
    self._wait_until_connectable(timeout=timeout)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 98, in _wait_until_connectable
    raise WebDriverException("The browser appears to have exited "
selenium.common.exceptions.WebDriverException: Message: The browser appears to have exited before we could connect. If you specified a log_file in the FirefoxBinary constructor, check it for details.

【问题讨论】:

【参考方案1】:

已修复: 此时的解决方案是降级Firefox! 运行此命令以获取可用 Firefox 版本的列表。

apt-cache show firefox | grep Version

我的结果:

Version: 47.0+build3-0ubuntu0.16.04.1
Version: 45.0.2+build1-0ubuntu1

安装:

sudo apt-get install firefox=45.0.2+build1-0ubuntu1

要保留此版本并禁止更新:

sudo apt-mark hold firefox

如果您想取消保留 firefox 版本并允许更新:

sudo apt-mark unhold firefox
sudo apt-get upgrade

【讨论】:

关于版本 45,我收到错误:E: Version '45.0.2+build1-0ubuntu1' for 'firefox' was not found 任何提示? 尝试添加 Firefox 存储库之前:sudo add-apt-repository ppa:ubuntu-mozilla-daily/ppa 我试过这个,然后重新启动 Firefox,然后当我再次运行 grep Version 时它仍然告诉我我使用的是最新版本(49)但是当我再次运行安装部分时它告诉我 45 是已安装。我现在有冲突吗?【参考方案2】:

从 Firefox 47.0 版开始(不久后推出),必须使用新的驱动程序(由 mozilla 而不是 selenium 创建)连接到 Firefox,因为该版本中引入了一个错误。从 Firefox 48.0 版开始,旧驱动程序将完全弃用,只能使用 Marionette,因此最好现在切换。见:Marionette Webdriver for Firefox

下载driver(在OSX中只需使用brew install geckodriver),在windows上将可执行文件重命名为wires.exe,在*nix系统上重命名为wires,并确保可执行文件存在于您的系统路径中,然后通过以下方式在您的程序中使用此驱动程序而不是旧驱动程序:

使用本地网络驱动程序时:

Python:

firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True

driver = webdriver.Firefox(capabilities=firefox_capabilities)

鲁比:

driver = Selenium::WebDriver.for :firefox, marionette: true

javascript

var capabilities = Capabilities.firefox();
capabilities.set('marionette', true);

var driver = new webdriver.Builder().withCapabilities(capabilities).build();

Java:

DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
Webdriver driver = new FirefoxDriver(capabilities);

C#:

var driver = new FirefoxDriver(new FirefoxOptions());

使用 selenium 网格时:

使用 selenium 网格时,驱动程序应该存在于网格中所有机器的路径中。

Python:

firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
driver = webdriver.Firefox(capabilities=firefox_capabilities)

鲁比:

caps = Selenium::WebDriver::Remote::Capabilities.firefox marionette: true
driver = Selenium::WebDriver.for :firefox, desired_capabilities: caps

Java:

DesiredCapabilities capabilities = DesiredCapabilities.firefox();
// Set Marionette on so the Grid will use this instead of normal FirefoxDriver
capabilities.setCapability("marionette", true);

WebDriver driver = new RemoteWebDriver(capabilities); 

C#:

DesiredCapabilities capabilities = DesiredCapabilities.Firefox();
// Set Marionette on so the Grid will use this instead of normal FirefoxDriver
capabilities.SetCapability("marionette", true);

var driver = new RemoteWebDriver(capabilities); 

【讨论】:

一旦我们下载驱动程序,我们应该把它放在哪里? 把它放在你想要的任何地方,然后将位置设置为系统路径中的驱动程序。 根据 MarionetteDriver 在 Selenium 的 Java 版本中的文档,它已被弃用 (github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/…)。 FirefoxDriver 应改为使用,marionette 应在 DesiredCapabilities 中启用(就像您在 RemoteWebDriver 示例中所做的那样。 木偶确实解决了这个问题。不过,它也有一些问题。首先,如果您使用 execute_script() 来读取 JavaScript 变量的值,则需要在变量名称前加上 window.wrappedJSObject。 (bugzilla.mozilla.org/show_bug.cgi?id=825858)。其次,不支持某些动作链函数,例如 move_to_element (groups.google.com/forum/#!topic/selenium-users/g8IK9AR7EIA)。 对于懒惰的 OSX 用户:brew install geckodriver【参考方案3】:

有些人的问题是marionette方式中某些buttons或select框无法选中。

另一种方法是使用较旧的 firefox 版本:

您可以下载二进制文件here 并在此处使用:

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

binary = FirefoxBinary('path/to/binary')
driver = webdriver.Firefox(firefox_binary=binary)

【讨论】:

【参考方案4】:

解决方案降级到 45 版本:

firefox --version
    Mozilla Firefox 47.0
apt-get remove firefox
wget https://ftp.mozilla.org/pub/firefox/releases/45.0/linux-x86_64/en-US/firefox-45.0.tar.bz2
tar -xjf firefox-45.0.tar.bz2
mv firefox /opt/firefox45
ln -s /opt/firefox45/firefox /usr/bin/firefox
firefox --version
    Mozilla Firefox 45.0

【讨论】:

【参考方案5】:

解决方案:将 Firefox 升级到 47.0.1,将 Selenium 升级到 2.53.1。

这个组合对我有用。

更多详情请参考https://***.com/a/37728659/6469532

【讨论】:

【参考方案6】:

1) 下载 geckodriver 0.6.2,解压,重命名为“wires”而不是“wires.exe” https://github.com/mozilla/geckodriver/releases

2)将wires可执行位置添加到PATH(我把它放在我的python文件夹C:Program Files\Python ...) 选择开始,选择控制面板。双击系统,然后选择高级选项卡。 单击环境变量。 ... 在编辑系统变量(或新系统变量)窗口中,指定 PATH 环境变量的值。 ...(使用 ';' 分隔路径,即 [C:Users\Reuben;C:Program Files\Python]

3) 降级到 Firefox 45 https://ftp.mozilla.org/pub/firefox/releases/45.0.2/win64/en-US/

【讨论】:

【参考方案7】:

无需降级 Firefox。我遇到了 Windows 和 Firefox 49 版本的问题。我使用的是 geckodrvier 64 位版本。我将其更改为 geckodrvier 32 位版本,它解决了这个问题。现在浏览器可以正常打开,没有任何问题。

【讨论】:

以上是关于Firefox 更新后无法使用 Selenium 打开浏览器的主要内容,如果未能解决你的问题,请参考以下文章

更新到 Angular 2 后,无法在 Firefox 上通过 Protractor 运行 Selenium

Selenium 2.50 无法在 Firefox 45 上运行

无法从 AWS 机器上的 python 中的 selenium 调用 firefox

org.openqa.selenium.firefox.NotConnectedException:45000 毫秒后无法连接到端口 7055 上的主机 127.0.0.1

Selenium 2.53 或 2.48 在 Firefox 48.0 中不起作用

python selenium 无法使用 Firefox 扩展 - 消息:无法加载配置文件。简介目录