使用 selenium webdriver chrome 处理“选择数字证书”

Posted

技术标签:

【中文标题】使用 selenium webdriver chrome 处理“选择数字证书”【英文标题】:Handling 'choose a digital certificate' with selenium webdriver chrome 【发布时间】:2013-02-04 06:53:56 【问题描述】:

当我使用 selenium webdriver 打开一个页面时,我得到一个 chrome 对话框“选择证书”。默认证书是正确的,所以我只需单击“确定”按钮。但我有这个问题。我有python代码:

drv = webdriver.Chrome()   
drv.get("https://example.com/login")

然后我想做类似的事情:

drv.switch_to_alert().accept()

drv.switch_to_alert().send_keys(Keys.TAB)
drv.switch_to_alert().send_keys(Keys.SPACE)

问题是代码在 drv.get("https://example.com/login") 行停止执行。 Webdriver 正在等待页面加载。在该行之前没有 chrome 对话框。

我该如何处理?

【问题讨论】:

【参考方案1】:

你必须使用 AutoIT 之类的东西:

http://www.autoitscript.com/site/autoit/

你为什么问?这是一个 OS 对话框,Selenium 不会也可能永远不会处理,因此您必须求助于其他解决方案(例如,在 C# 中,您应该使用本机 Win32 API 方法来单击按钮)。

【讨论】:

你在 Linux 上做什么?【参考方案2】:

证书由操作系统而非浏览器管理。从浏览器的证书存储中删除除必要证书之外的所有证书,然后将浏览器配置为在仅存在一个证书时自动选择证书。您还可以创建浏览器配置文件并让您的程序启动此配置文件或避免通过 HTTPS 进行测试。

【讨论】:

如何配置chrome不询问就接受默认证书?【参考方案3】:

在此处处理任何内容之前,请在下方添加,以便在您导航/触发证书弹出时它不会立即冻结。请记住稍后添加正确的等待时间。

 getDriver().manage().timeouts().pageLoadTimeout(1000, TimeUnit.MILLISECONDS); 

在此之后,您可以尝试使用键盘或 autoIt 。

【讨论】:

【参考方案4】:

您可以为 Chrome 配置您的策略组,选择您的证书。

Chrome 使用带有您证书信息的 json 注册表。配置 gpo 后,想办法用 Python 修改这个 json。

在 C# 中,我使用 Microsoft.Win32.Registry 来操作注册表。

按照步骤配置您的 gpo:

首先我要感谢 IngussNeilands 在他的 Github 上提供的教程。它救了我! 您可以按照 IngussNeilands 的教程here 中的步骤操作,或者按照我的以下教程进行操作。 ## 配置策略组的步骤

    从此处下载 Chrome 政策模板:http://dl.google.com/dl/edgedl/chrome/policy/policy_templates.zip

    解压.zip 文件并找到与您的Windows 上的国家和语言设置相匹配的chrome.adm,遵循以下路径:policy_templates\windows\adm\<YourCountryAndLanguage>\chrome.adm

    在 Windows 搜索栏中键入 "run" 或按 Windows + R。然后输入 de command gpedit.msc 打开本地组策略编辑器

    现在,访问:'Computer Policy>> Computer Configuration' 并右键单击文件 'Administrative Templates' 并选择 'Add or remove tamplates'

    单击'add' 并导航到您之前在'policy_templates\windows\adm\<YourCountryAndLanguage>\chrome.adm' 上选择的chrome.adm。点击打开

    现在,导航到: 'Computer Policy>> Computer Configuration>> Administrative Templates>> Classic Administrative Templates(ADM)>> Google>> Google Chrome>> Content Settings'

    然后在窗口的右侧找到并双击选项'Automatically select client certificates for these sites'

    点击'Enabled'选项

    现在,点击下方选项窗格中的'Show...'

    复制下面的'JSON' 并将其粘贴到值列的行中: "pattern":"https://[*.]example.com","filter":"ISSUER":"CN":"example.com", "SUBJECT":"CN":"value"。这个 JSON 需要用你的证书信息重写

如何重写 Chrome 配置 JSON

好的,现在就给大家简单介绍一下如何重写 Chrome Config JSON。

在“模式”键中,值需要是证书将被发送到的 URL。在大多数情况下,此 URL 与页面的 URL 相同,但某些站点不使用相同的 URL 库来发送证书。 例如,当我尝试 webscraping Uberlândia 市的 NFS-e 时,我需要调试页面脚本以找到发送证书的 URL。

“过滤器”键将包含证书信息。就我而言,我需要使用不同的证书访问同一个网站,因为我必须用“ISSUER”和“SUBJECT”的信息填充 JSON。 Chrome 会选择一个与过滤键中的信息内容匹配的证书。例如,如果我用“SERASA Certificadora Digital v5”填充“ISSUER”对象的“CN”,我将拥有多个包含这些信息的证书,Chrome 将无法选择正确的证书。

在我here 的 git 中,您可以找到更改 JSON 以使用多个证书访问同一站点的解决方案。

【讨论】:

以上是关于使用 selenium webdriver chrome 处理“选择数字证书”的主要内容,如果未能解决你的问题,请参考以下文章

selenium源码分析

Selenium-java-框架启动主流浏览器

Python + selenium 爬取百度文库Word文本

如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]

selenium3 + python - page_source页面源码

如何使用selenium webdriver来判断一个网页加载完毕