window.navigator.webdriver
对象,正常的浏览器中是没有这个对象的。navigator.webdriver
的值,其值为false
,但在无头浏览器中,其值仍然为true
。window.chrome
的值为undefined
。Notification.permission
值为denied
),但是权限的申请状态又不会发生变化(访问permissionStatus.state
的值依旧为prompt
,表示用户还未操作是否给予权限),前后是相矛盾的。navigator.plugins
返回的列表一定不为空,而无头浏览器一般是没有浏览器插件的。BTW:即便你新安装的浏览器,你的浏览器也是默认带一个PDF插件的,用于在浏览器标签页中打开PDF文件。
navigator.plugins
返回的对象类型为PluginArray
,而不是一个普通的数组。在无头浏览器中则不是。navigator.languages
,返回值一般为undefined
或者一个空列表。而在正常的浏览器中,返回值为当前浏览器的语言,如['en-US', 'en']
。Brian Paul
,正常浏览器一般为Intel Open Source Technology Center
或者Google Inc
。Mesa OffScreen
,正常浏览器中显示的一般和你电脑显卡的型号有关。就比如我的电脑采用的是Intel的集成显卡,显示的WebGL Render的值就为:ANGLE (Intel(R) UHD Graphics 630 Direct3D11 vs_5_0 ps_5_0)
。div
的offsetHeight
属性值的时候,返回值如果不为1,那就是无头浏览器。这种识别方式有很强的局限性,仅局限于使用High DPI显示器在正常的浏览器中渲染的网页这个offsetHeight
属性才会返回1。而在无头浏览器中,不管是不是High DPI的显示器,都会返回其它值。
img
标签加载一个失效的图片链接,然后再通过js去访问这个img
标签所指向图片的宽度和高度,在无头浏览器中,返回的宽度值和高度值均为0。在正常的浏览器中,返回的数值和你当前浏览器窗口的大小和缩放比例有关,是个非0值。PhantomJS
字样。window.callPhantom
、window._phantom
和window.phantom
,返回的值均为undefined
,而使用PhantomJS渲染的网页,三个值均不为undefined
。navigator.languages
的值为undefined
。WebSocket
对象:DOMException
而在PhantomJS渲染的环境下抛出的异常为SyntaxError
。false
,正常浏览器则为true
:RangeError: Maximum call stack size exceeded
,且我们透过depth
记录的递归深度值要远远大于通过catch抛出的异常中的栈长度的。如果这个大小关系反过来了,那就极有可能是透过PhantomJS渲染的。screen.availWidth
和screen.availHeight
获取显示浏览器的屏幕的可用宽度和可用高度,使用screen.width
和screen.height
获取显示浏览器的屏幕的宽度和高度。正常情况下,可用宽度是小于等于屏幕宽度的,可用高度也是小于等于屏幕高度的。而在PhantomJS渲染的环境下,这个关系可能就会反过来。srcdoc
指定HTML代码的iframe
的,例如:undefined
。在正常的浏览器中,访问如下这些对象,返回均为undefined
。pending
状态。canvasCtx.getImageData(0, 0, 1, 1)
复制这个像素点的像素值,如果返回结果的第四个通道的值为0,也就是透明的话,说明为正常的浏览器。TL;DRChromium项目为什么没有H264等一众音视频解码器?因为版权原因,Chromium项目作为一个开源项目,其仅仅是一个浏览器项目,是没有集成各种有版权的音视频解码器的。而Google Chrome浏览器是自带各种音视频解码器的,所以如果使用的是Google Chrome浏览器的无头模式,这种方法就会失效。