如何以编程方式为Selenium ChromeDriver禁用“云打印”“网络上的新打印机”弹出窗口?

时间:2018-11-28 22:13:44

标签: java selenium google-chrome selenium-chromedriver

在为Selenium配置ChromeDriver选项时,如何以编程方式禁用Chrome的Cloud Print“网络上的新打印机”弹出窗口?

每当ChromeDriver启动时,云打印弹出窗口就会在几秒钟内出现。

Cloud Print Chrome popup

可以通过在chrome://settings中关闭普通的Chrome用户来disable the Cloud Print popup

Chrome settings to disable the cloud print popup

AFAIK禁用了Chrome配置文件,但不适用于Selenium,因为每个新的驱动程序实例都具有干净的配置文件配置文件。另外,我不想执行UI自动化来为每个新的驱动程序实例关闭此功能,而是让弹出窗口此时出现(过多增加了复杂性并为折衷提供了失败的空间)。

使用ChromeOptions.setExperimentalOption("prefs", prefs)

我试图使用Chromium's ChromeDriver documentation on Setting a Chrome Preference设置各种首选项以关闭云打印。

以下是有关如何设置设置Chrome偏好设置的示例

ChromeOptions options = new ChromeOptions();
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.default_content_settings.popups", 0);
options.setExperimentalOption("prefs", prefs);

Chrome Switchesmore switches)似乎都不会执行禁用弹出窗口的技巧,但是某些Chrome Preferences看起来却可能可能工作。

// Enable notifications for new devices on the local network that can be
// registered to the user's account, e.g. Google Cloud Print printers.
const char kLocalDiscoveryNotificationsEnabled[] = "local_discovery.notifications_enabled";

// *************** SERVICE PREFS ***************
// These are attached to the service process.

// ...

const char kCloudPrintProxyEnabled[] = "cloud_print.enabled";

所以我们尝试使用这些:

ChromeOptions options = new ChromeOptions();

final Map<String, Object> prefs = new HashMap<>();
prefs.put("local_discovery.notifications_enabled", 0);
prefs.put("cloud_print.enabled", 0);
options.setExperimentalOption("prefs", prefs);

return new ChromeDriver(options);

但是,如Chromium ChromeDriver docs page所示,提供0时,尝试使用这些首选项无效。

  

注意:当我使用"false"而不是0时,我不再能够再现云打印机的弹出窗口,但是话又说回来,我无法再现该问题(强制它),就像我之前通过切换设置一样在我正常的非驱动程序浏览器上。使用字符串"false" 可能是答案,但是直到我可以通过在两者之间进行切换来确认之前,我不敢相信它,而在我将其归入网络打印机hijinks之前在写这个问题。

我觉得这是我最接近解决方案的地方,其他一切都只是猜测和探索。

编辑:按照this (very sensible) SO answer的建议隔离偏好更改后,差异显示为:

<     "notifications_enabled": true
---
>     "notifications_enabled": false

在JSON中跟随它的实际行/值时,如下所示:

"local_discovery": {
  "notifications_enabled": true

这似乎是我们正在寻找的prefs.put("local_discovery.notifications_enabled", 0);!现在,最后的诀窍是确定它的位置,并根据true / false输入可重复地启用/禁用弹出窗口...如此接近!

其他可能的潜在客户或替代品(但可能只是死胡同)

对于此问题,我确实有另一种想法/备份计划:如果无法通过Chrome偏好设置以编程方式禁用弹出窗口,我想是在关闭“云打印”设置的情况下创建Chrome配置文件并共享它由于ChromeDriver似乎具有用于设置配置文件目录的命令行标志/参数,因此在两次测试之间可能会起作用。但是,如果我们可以正确使用Chrome偏好设置的话,将会变得非常容易。


我还有一些辅助问题可以简化此操作,如果您知道该怎么做,请发表评论:

  1. 有什么办法告诉我,设置ExperimentalOption首选项有什么作用?是否有某种Hello World偏好设置很容易看出区别?
  2. 我是否在正确的位置查找偏好名称? this Chromium Source file是否是合适的观看地点?我可以找到一个更容易找到偏好名称的地方吗?
  3. 使“云打印”认为网络上有打印机的最简单方法是什么?在某些时候,我丢失了引起弹出窗口的任何打印机,这使得无法测试/重现问题/解决方案。如果可以验证,则可以关闭此问题并发布答案。

Selenium.Chrome where can I find a list of all available ChromeOption arguments? C#大喊大叫,这是Google或SO上唯一使我指向Chrome偏好设置的搜索结果。我希望对此有更好的文档...

0 个答案:

没有答案