无法在 Chrome v76 中隐藏“Chrome 正在由自动化软件控制”信息栏

Posted

技术标签:

【中文标题】无法在 Chrome v76 中隐藏“Chrome 正在由自动化软件控制”信息栏【英文标题】:Unable to hide "Chrome is being controlled by automated software" infobar within Chrome v76 【发布时间】:2019-12-09 10:53:23 【问题描述】:

将 Chrome 更新到版本 76 后,我无法弄清楚如何隐藏“Chrome 正在由自动化软件控制...”通知覆盖页面上的某些控件。

ChromeDriver 的最新稳定版本确实是 76.0.3809.68。 以下代码适用于 Chrome 75 和 ChromeDriver 74。

var options = new ChromeOptions();
options.AddArgument("--test-type");
options.AddArgument("--disable-extensions");
options.AddArguments("disable-infobars");
options.AddArguments("--disable-notifications");
options.AddArguments("enable-automation");
options.AddArguments("--disable-popup-blocking");
options.AddArguments("start-maximized");
var driver = new ChromeDriver(driverLocation, options, ScriptTimeout);

【问题讨论】:

这听起来像是 Chrome 的问题,而不是真正的 C# 【参考方案1】:

截至 2019 年 8 月 1 日 - 您可以发送 excludeswitch - enable-automation 来隐藏消息。并禁用弹出“禁用开发者模式扩展”设置 使用自动化扩展=假。 Refer for useAutomationExtension

测试于:Windows 10 版本 76.0.3809.87(官方版本)(64 位) ChromeDriver 76.0.3809.68

--enable-automation :通知用户他们的浏览器正在被自动化测试控制Reference

     "goog:chromeOptions": 

        "excludeSwitches": [ "enable-automation" ],
        "useAutomationExtension": false
     

在 C# 中:

禁用弹出“禁用开发者模式扩展”和自动化信息栏消息。

options.AddExcludedArgument("enable-automation");
options.AddAdditionalCapability("useAutomationExtension", false);

在 JAVA 中:

options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
options.setExperimentalOption("useAutomationExtension", false);

在 Python 中:

options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

在量角器中:

在 conf.js/conf.ts 中添加以下功能

capabilities: 
    'browserName': 'chrome',
    "goog:chromeOptions": 
      "excludeSwitches": [ "enable-automation" ],
      "useAutomationExtension": false
   
  ,

【讨论】:

@g-victor 确保删除 options.AddArguments("enable-automation");您的代码中的这一行也是如此 信息栏被隐藏。但问题无法隐藏“禁用 Chrome 中弹出的开发者模式扩展”弹出窗口。我使用了下一个选项: var options = new ChromeOptions(); options.AddArgument("--test-type"); options.AddArgument("--disable-extensions"); options.AddExcludedArgument("启用自动化"); options.AddArguments("开始最大化"); 作为解决方法添加 options.AddAdditionalOption("useAutomationExtension",false) useAutomationExtension = false 不起作用@RahulL。 “开发人员模式扩展......”仍然退出,但我需要使用我的扩展来自动化过程。我使用了这些选项: chromeOptions.AddArguments("disable-infobars"); chromeOptions.AddArgument("--disable-blink-features=BlockCredentialedSubresources"); chromeOptions.AddArgument("--disable-notifications"); chromeOptions.AddUserProfilePreference("enable_do_not_track", true); chromeOptions.AddAdditionalCapability("useAutomationExtension", false); chromeOptions.AddExcludedArgument("启用自动化"); @duong-khang chromeOptions.useAutomationExtension。仅适用于客户端启用或禁用“ChromeDriver 自动化扩展” 【参考方案2】:

Chromium 团队早些时候引入了信息栏 Chrome is being controlled by automated test software 以通过 commit 禁用 Chrome 浏览器中的 Developer mode extension 弹出窗口。

根据Flakiness due to Chrome automation infobar (Chrome 57+) 的讨论,添加了 信息栏 以显示 如果会话由 Chrome 中的自动测试控制,观察到存在Chrome 自动化信息栏的 Chrome is being controlled by automated test software 间歇性地导致 click() 功能失败。在测试期间,当通过在chrome_launcher.cc 中传递disable-infobars 删除信息栏时,上述测试将按预期运行,没有任何问题。 gmanikpure@chromium.org确认罪魁祸首是changelog:

Add an infobar if a session is being controlled by an automated test.

This infobar is only displayed if the browser is launched with the --enable-automation switch. It also disables the developer mode extensions warning bubble.

TEST=launch with and without --enable-automation, and check for presence of automation infobar

据观察,在单击期间会出现信息栏动画,并且我们得到了不稳定的结果。因此,Chromium 团队需要以某种方式检测这种变化并重新计算位置。实际问题是,如果发生 Page.frameResized,我们可以使某些操作的结果无效并重试(例如获取元素位置),但还有其他操作可以修改页面,例如鼠标单击。鼠标单击(包括 mousemove、mousedown 和 mouseup 事件)可能会在中间发生 resize 事件。

据此,Chromium 团队通过这个commit 发布了一个修订:

Disable info bar animations during automated testing.

从那时起 Chrome 用户,开始使用禁用信息栏:

Java:

options.addArguments("disable-infobars");

Python:

options.add_argument("disable-infobars")

C#:

option.AddArguments("disable-infobars");

现在在讨论Chrome is being controlled by automated test software infobar doesn't gets suppressed despite using disable-infobars argument Chromium 团队成员triciac@chromium.org 明确提到:

从 v 76 开始,抑制信息栏的功能已从命令行选项移至 Chrome 的企业策略设置。

Release Notes 和Chrome Enterprise release notes 中已经提到更改如下

--disable-infobars is no longer supported

Chrome will no longer support the --disable-infobars flag, which was used to hide pop-up warnings
from Chrome Browser. To support automated testing, kiosks, and automation, the
CommandLineFlagSecurityWarningsEnabled policy was added to allow you to disable some security
warnings.

因此,从 Chrome v76.x 开始,--disable-infobars 标志被正式弃用。


结论

该策略不是在 ChromeDriver 或 Chrome 启动时设置的选项功能,因为安全策略通常由您的公司 IT 部门管理。因此,disable-infobars 的使用已被弃用。


一个小技巧

--disable-infobars 标志仍然可以使用这 2(两个)ExperimentalOptionChrome v76.x 中删除:

Excludingenable-automation 的开关 将useAutomationExtension设置为False

实现

以下是实现:

Java:

ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized");
options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
options.setExperimentalOption("useAutomationExtension", false);
WebDriver driver = new ChromeDriver(options);
driver.get("https://google.com");

Python:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get('https://www.google.co.in')

结尾

根据文章CommandLineFlagSecurityWarningsEnabled:

Enable security warnings for command-line flags

Supported on: Google Chrome (Linux, Mac, Windows) since version 76

Description: If disabled, prevents security warnings from appearing when Chrome is launched with some potentially dangerous command-line flags.
             If enabled or unset, security warnings are displayed when some command-line flags are used to launch Chrome.
             On Windows, this policy is only available on instances that are joined to a Microsoft Active Directory domain or Windows 10 Pro or Enterprise instances that are enrolled for device management.

【讨论】:

自 Chrome 79 版起不再支持 为什么有人要禁用 chrome 信息栏? @MasterJoe2 在某些情况下(包括我的),信息栏会导致 click() 函数失败。如果失败,某些测试可以使元素在 DOM 中但在视口中不可见。信息栏似乎将网站的视口向下推了一点,因此使其他元素无法点击【参考方案3】:

这将在 C# 中工作:

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.AddArgument("--incognito");
chromeOptions.AddExcludedArgument("enable-automation");
chromeOptions.AddAdditionalCapability("useAutomationExtension", false);

【讨论】:

【参考方案4】:

在 C# for Chrome v76 中隐藏“Chrome 正在由自动化测试软件控制”信息栏:

var chromeOptions = new ChromeOptions();
...
chromeOptions.AddAdditionalCapability("useAutomationExtension", false);
chromeOptions.AddExcludedArgument("enable-automation");
...
var driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), chromeOptions, commandTimeout);

【讨论】:

【参考方案5】:

    您可以使用--app=desired_address_without_brackets 标志,例如--app=https://google.com。适用于 Chrome 80。 当然,只有当您的项目可以在 App 模式下启动并且您有一个可以在其中插入的页面链接时,它才有效。请参阅this answer of mine 了解更多信息。

    您也可以使用--test-type 命令行标志,它也可以删除此类信息栏。 注意力! 在极少数情况下,它会导致奇怪的事情,比如静音页面声音!所以我不确定我是否应该首先推荐它。

【讨论】:

什么是应用模式? 不确定,不过你可以看到:auslogics.com/en/articles/google-chrome-in-application-mode【参考方案6】:

在 Ruby 中,对于经常与 Capybara 一起使用的 selenium-webdriver gem,请使用 ::Selenium::WebDriver::Chrome::Options#add_option('excludeSwitches', ['enable-automation'])

例如:

Capybara.register_driver :selenium_chrome do |app|
  browser_options = ::Selenium::WebDriver::Chrome::Options.new
  browser_options.add_option 'excludeSwitches', ['enable-automation']
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
end

【讨论】:

【参考方案7】:

对我来说,Ruby 中的另一个选择是:

Capybara.register_driver :selenium_chrome do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: chrome_options)
end

def chrome_options
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_option 'excludeSwitches', ['enable-automation']
  options.add_argument('incognito')
  options.add_argument('disable-geolocation')
  options.add_argument('ignore-certificate-errors')
  options.add_argument('disable-popup-blocking')
  options.add_argument('disable-web-security')
  options.add_argument('--disable-infobars')
  options.add_argument('disable-translate')
  options
end

【讨论】:

【参考方案8】:

显然您可以使用 CommandLineFlagSecurityWarningsEnabled chrome 策略 - https://www.chromium.org/administrators/policy-list-3#CommandLineFlagSecurityWarningsEnabled

在 Linux 上,我能够在 /etc/opt/chrome/policies/managed/managed_policies.json 中创建一个文件,其内容为:"CommandLineFlagSecurityWarningsEnabled": false,这禁用了警告。

在 Windows 10 Pro 上,当我将 Chrome 组策略“启用命令行标志的安全警告”设置为禁用(请参阅 https://support.google.com/chrome/a/answer/187202)并检查 Software\Policies\Google\Chrome\CommandLineFlagSecurityWarningsEnabled 中的注册表时,其值为0x00000000 我无法禁用此警告。也许它会适合你?想知道其他人是否可以帮助阐明为什么它不能在 Windows 上运行

【讨论】:

以上是关于无法在 Chrome v76 中隐藏“Chrome 正在由自动化软件控制”信息栏的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 65 无法打印隐藏的 iframe

为啥我的 YouTube 链接没有在 Chrome 的 iframe 中自动播放? [复制]

frameset 在 Google Chrome 中无法隐藏左边栏解决方法!

Chrome 10.0.612 开发 Websocket 问题?

Safari/Chrome (Webkit) - 无法隐藏 iframe 垂直滚动条

python webdriver.chrome 无法隐藏浏览器窗口?