没有 Marionette,Geckodriver/Firefox 怎么工作? (运行 python 硒 3 对 FF 53)
How can Geckodriver/Firefox work without Marionette? (running python selenium 3 against FF 53)
我只在 selenium 控制的 firefox 弹出窗口中看到一个奇怪的 "untrusted cert" 错误。非常具体。为了解决这个问题,各种google结果建议关闭marionette,像这样:
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = False
driver = webdriver.Firefox()
这是有效的,但是如何呢??在关闭 Marionette 的情况下,geckodriver 是如何工作的?
来自:
Marionette is an automation driver for Mozilla's Gecko engine.
答案继续明确表示它应该失败:
"In case of using the Firefox 53.x browsers if you forcefully set "marionette" to false through DesiredCapabilities class you will observe a UnreachableBrowserException."
那么,这到底是怎么回事?
您已经处理了以下几件事:
"untrusted cert" error only on selenium-controlled firefox pop-ups
:这是一个常见问题,我们可以通过 DesiredCapabilities
class. 配置 WebDriver
实例来避免这个问题
turning off marionette
:当我们使用 Selenium 3.x 和最新的 Mozilla Firefox 浏览器版本时,关闭 marionette
不再是解决方案。通过 DesiredCapabilities class 强制设置 "marionette" 为 false,您将无法打开版本 48.x.[=52= 以上的 Mozilla Firefox 浏览器]
- 关于您的代码,我没有发现您的代码中有任何重大错误。您已通过
DesiredCapabilities
class 将 "marionette" 设置为 false 但仍然有效并打开旧版本的 Mozilla Firefox 浏览器会话,该版本也安装在您的版本低于 48.x 的机器
- 为了快速测试,我只是复制了您的代码并打开了 url
https://www.whatismybrowser.com/
。
代码:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = False
driver = webdriver.Firefox()
driver.get('https://www.whatismybrowser.com/')
结果: Mozilla Firefox 版本 47 已打开。
- 现在根据 Selenium 3.4.x 规范,我做了一些修改。将 "marionette" 改为 true 并在初始化驱动程序时添加
executable_path
。
It is to be noted that the current Selenium-Python binding is unstable with geckodriver and looks to be Architecture specific. You can find the github discussion and merge here. So you may additionally need to pass the absolute path of the firefox binary as firefox_binary
argument while initializing the webdriver
代码:
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
binary = FirefoxBinary('C:\Program Files\Mozilla Firefox\firefox.exe')
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
driver = webdriver.Firefox(firefox_binary=binary,executable_path='C:\Utility\BrowserDrivers\geckodriver.exe')
driver.get('https://www.whatismybrowser.com/')
结果: Mozilla Firefox 版本 53 已打开。
我只在 selenium 控制的 firefox 弹出窗口中看到一个奇怪的 "untrusted cert" 错误。非常具体。为了解决这个问题,各种google结果建议关闭marionette,像这样:
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = False
driver = webdriver.Firefox()
这是有效的,但是如何呢??在关闭 Marionette 的情况下,geckodriver 是如何工作的?
来自
Marionette is an automation driver for Mozilla's Gecko engine.
答案继续明确表示它应该失败:
"In case of using the Firefox 53.x browsers if you forcefully set "marionette" to false through DesiredCapabilities class you will observe a UnreachableBrowserException."
那么,这到底是怎么回事?
您已经处理了以下几件事:
"untrusted cert" error only on selenium-controlled firefox pop-ups
:这是一个常见问题,我们可以通过DesiredCapabilities
class. 配置 turning off marionette
:当我们使用 Selenium 3.x 和最新的 Mozilla Firefox 浏览器版本时,关闭marionette
不再是解决方案。通过 DesiredCapabilities class 强制设置 "marionette" 为 false,您将无法打开版本 48.x.[=52= 以上的 Mozilla Firefox 浏览器]- 关于您的代码,我没有发现您的代码中有任何重大错误。您已通过
DesiredCapabilities
class 将 "marionette" 设置为 false 但仍然有效并打开旧版本的 Mozilla Firefox 浏览器会话,该版本也安装在您的版本低于 48.x 的机器
- 为了快速测试,我只是复制了您的代码并打开了 url
https://www.whatismybrowser.com/
。
WebDriver
实例来避免这个问题
代码:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = False
driver = webdriver.Firefox()
driver.get('https://www.whatismybrowser.com/')
结果: Mozilla Firefox 版本 47 已打开。
- 现在根据 Selenium 3.4.x 规范,我做了一些修改。将 "marionette" 改为 true 并在初始化驱动程序时添加
executable_path
。
It is to be noted that the current Selenium-Python binding is unstable with geckodriver and looks to be Architecture specific. You can find the github discussion and merge here. So you may additionally need to pass the absolute path of the firefox binary as
firefox_binary
argument while initializing the webdriver
代码:
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
binary = FirefoxBinary('C:\Program Files\Mozilla Firefox\firefox.exe')
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
driver = webdriver.Firefox(firefox_binary=binary,executable_path='C:\Utility\BrowserDrivers\geckodriver.exe')
driver.get('https://www.whatismybrowser.com/')
结果: Mozilla Firefox 版本 53 已打开。