热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《检测从JavaScript无头模式运行的Chrome》经验,为你挑选了4个好方法。

随着Chrome 59的发布,"无头"模式现在可用于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无头模式下运行?



1> Josh Lee..:

所述用户代理字符串包括HeadlessChrome代替Chrome.这可能是您打算寻找的信号,因此您可以使用:

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

其他有趣的信号包括:

window.chrome当无头时,它看起来是不确定的.

[innerWidth, innerHeight][800, 600](硬编码headless_browser.cc),[outerWidth, outerHeight]而是[0, 0](通常不应该发生).



2> Justas..:

您可以查看以下navigator.webdriver房产:

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

...

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

Chrome使用--enable-automation--headless标志.
火狐marionette.enabled偏好或--marionette标志传递.

W3C WebDriver建议书描述如下:

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



3> Hugues M...:

刚刚阅读Antoine Vastel撰写的这篇文章,它提供了几种方法:

测试用户代理/HeadlessChrome/.test(window.navigator.userAgent),但这很容易被欺骗

测试插件 navigator.plugins.length == 0

测试语言 navigator.languages == ""

测试WebGL供应商和渲染器信息(有关详细信息,请参阅文章)

测试由Modernizr检测到的支持功能:似乎不支持"hairlines"(hidpi/retina hairlines,其宽度小于1px的CSS边界,在hidpi屏幕上物理1px).测试是!Modernizr["hairline"].

测试占位符的大小以查找丢失的图像.插入包含无效URL的图像,并测试image.width == 0 && image.height == 0in image.onerror(他们发现这个图像最强大).

不能代表Google的动机(Headless Chrome只是关于促进网络应用程序的测试吗?嗯...),但这可以看作是一个可能在某一天得到修复的错误列表,所以人们不得不怀疑这些错误有多长测试会工作:)



4> 小智..:

到目前为止,我拥有的最好的解决方案是此hack。我不会在产品代码中使用它,但可能会在测试中使用它。

通常会为所有网站启用Chrome的弹出窗口阻止程序,但在无头模式下将其禁用。我们可以使用打开弹出窗口的功能作为处于无头模式的相当准确的代理。实现很简单:尝试open(...)打开一个窗口,然后检查是否得到了null(表明它已被阻止)而不是Window对象。如果我们确实打开了一个,请尽快将其关闭。

function canPopUp() {
  var w = open("");
  if (w !== null) {
    w.close();
    return true;
  } else {
    return false;
  }
}

var isHeadless = canPopUp;

作为一个简单的示例,您可以尝试使用带有和不带有--headless标记的以下内容:

chrome --headless --disable-gpu --dump-dom 'data:text/html,'


推荐阅读
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
author-avatar
手机用户2502875927
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有