Selenium、Python、Marionette 证书警告

发布时间:2021-02-26 20:26

我正在尝试将备份文件从(本地)无头 数据服务器自动推送到(远程)安全 备份服务器 - [出于某些原因] ](目前)需要通过网页完成。

我编写了一个运行良好的 Selenium/Python 脚本,但忽略了所有证书错误 - 在这种情况下,这不是所需的行为。

  • 平台:Raspberry Pi 3B / Raspbian 10
  • Selenium:v3.141.0(来自 Raspbian 存储库)
  • Geckdriver:v0.29(使用 rust v1.50 从 github 发布源构建)
    ...安装:cp /path/to/geckodriver-0.29.0/target/debug/geckodriver /usr/local/bin
  • Firefox:v78.7.0esr(来自 Raspbian 存储库)

大多数人(在我的搜索中)似乎都有确切的 /opposite/ 问题 - IE。他们想要禁用安全机制......但是在许多不同的解决方案中反转(字面意思是真/假)逻辑并没有让我找到一个允许我启用证书检查的解决方案。

这是一些(缩写和注释)示例代码,其中包括我的(多次)尝试之一:

#!/bin/python3

from selenium import webdriver  # selenium instance
from selenium.webdriver.firefox.options import Options  # headless
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities  # Reject bad SSL

# Set headless mode
opts = Options()
opts.headless = True

# Enforce certificate checking - [this fails]
caps = DesiredCapabilities.FIREFOX
print(caps)  # {'browserName': 'firefox', 'marionette': True, 'acceptInsecureCerts': True}
caps['acceptInsecureCerts'] = False
print(caps)  # {'browserName': 'firefox', 'marionette': True, 'acceptInsecureCerts': False}

driver = webdriver.Firefox(capabilities=caps, options=opts)

# LOG FILE ENTRY APPEARS in geckodriver.log:
# "Marionette  WARN  TLS certificate errors will be ignored for this session"

driver.get("https://wrong.host.badssl.com")

# <<perform upload here>>

driver.save_screenshot("test.png")  # Page was NOT blocked! :(

driver.close()

我的问题是: 可以对此代码进行哪些修改,以便当(且仅当)SSL/TLS 证书有效时<<upload>> 才会发生?

如果 <<upload>> 被阻止,额外的代码行会显示原因 {"self-signed cert", "cert revoked", etc} 的额外荣誉。

回答1
from selenium import webdriver
capabilities = webdriver.DesiredCapabilities().FIREFOX
capabilities['acceptInsecureCerts'] = False
capabilities['marionette'] = True
driver = webdriver.Firefox(desired_capabilities=capabilities)


# LOG FILE ENTRY APPEARS in geckodriver.log:
# "Marionette  WARN  TLS certificate errors will be ignored for this session"

driver.get("https://wrong.host.badssl.com")

你应该使用 desiredcapability ,使用上面的代码