从 JavaScript 检测以无头模式运行的 Chrome

新手上路,请多包涵

随着 Chrome 59 的发布,“headless”模式 现在可以 在 Linux 和 macOS 的稳定版本中使用(很快还有带有 Chrome 60 的 Windows)。这使我们能够在没有任何可见 UI 的情况下运行功能齐全的 Chrome 版本,这是自动化测试的强大功能。 这里有例子。

 chrome --headless --disable-gpu --dump-dom https://stackoverflow.com/

在我的 JavaScript 测试运行器中,我喜欢记录尽可能多的有关正在使用的浏览器的信息,以帮助隔离问题。比如我记录了 navigator 的很多属性,包括当前的浏览器插件:

 JSON.stringify(Array.from(navigator.plugins).map(p => p.name))

 ["Chrome PDF Viewer","Widevine Content Decryption Module","Shockwave Flash","Native Client","Chrome PDF Viewer"]

我的理解是 Chrome 在无头模式下 应该 表现相同,但我有足够的经验对可能显着改变渲染管道的新功能持怀疑态度。

现在,我将在两种模式下运行测试。我想让测试运行器记录是否正在使用无头模式。我可以在测试配置中传递这些信息,但我更愿意拥有一个可以构建到测试运行器本身的纯 JavaScript 解决方案。但是,我无法找到任何显示无头模式是否处于活动状态的浏览器界面。

有什么方法可以检测 Chrome 是否从 JavaScript 以无头模式运行?

原文由 Jeremy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

您可以检查 navigator.webdriver 属性,即:

webdriver navigator 接口的只读属性指示用户代理是否由自动化控制。

navigator.webdriver 属性在以下情况下为真:

Chrome 使用 --enable-automation--headless 标志。

Firefox 传递了 marionette.enabled 偏好或 --marionette 标志。

W3C WebDriver Recommendation 对其描述 如下:

navigator.webdriver 定义了一种标准方式,用于协作用户代理以通知文档它由 WebDriver 控制,例如,以便在自动化期间可以触发备用代码路径。

原文由 Justinas Jakavonis 发布,翻译遵循 CC BY-SA 4.0 许可协议

用户代理 字符串 包括 HeadlessChrome 而不是 Chrome 。这可能是您要寻找的信号,因此您可以使用:

 /\bHeadlessChrome\//.test(navigator.userAgent)

其他有趣的信号包括:

  • 看起来 window.chrome 在无头时未定义。
  • [innerWidth, innerHeight] is [800, 600] (hardcoded in headless_browser.cc ), while [outerWidth, outerHeight] is [0, 0] (which shouldn’t usually happen ).

原文由 Josh Lee 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题