Selenium 无头谷歌浏览器:如何防止网站知道他们的窗口是否聚焦
有没有办法防止站点知道它们是否可见 也许是命令行标志?我在这里查过了,但找不到合适的 我认为他们使用页面可见性API:页面可见性API 如前所述,当试图通过让页面在文档不可见时避免执行不必要的任务来节省资源和提高性能时,文档非常方便 根据: 页面可见性API定义了一种方法,用于以编程方式确定顶级浏览上下文的可见性状态,并在可见性状态更改时收到通知。在不知道页面的可见性状态的情况下,web开发人员一直在设计网页,就好像它们总是可见的一样。这不仅会提高机器资源利用率,而且会阻止web开发人员根据用户是否可以看到网页来做出运行时决策。通过了解网页的可见性状态来设计网页,可以改善用户体验,提高网站的能效 使用此API,web应用程序可以根据用户是否可见来选择更改其行为。例如,当页面不再可见时,此API可用于缩减工作Selenium 无头谷歌浏览器:如何防止网站知道他们的窗口是否聚焦,selenium,selenium-webdriver,puppeteer,google-chrome-headless,symfony-panther,Selenium,Selenium Webdriver,Puppeteer,Google Chrome Headless,Symfony Panther,有没有办法防止站点知道它们是否可见 也许是命令行标志?我在这里查过了,但找不到合适的 我认为他们使用页面可见性API:页面可见性API 如前所述,当试图通过让页面在文档不可见时避免执行不必要的任务来节省资源和提高性能时,文档非常方便 根据: 页面可见性API定义了一种方法,用于以编程方式确定顶级浏览上下文的可见性状态,并在可见性状态更改时收到通知。在不知道页面的可见性状态的情况下,web开发人员一直在设计网页,就好像它们总是可见的一样。这不仅会提高机器资源利用率,而且会阻止web开发人员根据用户
可见性状态 顶级浏览上下文的文档可以处于以下任一可见性状态:
- 隐藏:文档在任何屏幕上都不可见
- 可见:文档至少在一个屏幕上部分可见
enum VisibilityState {
"hidden", "visible"
};
partial interface Document {
readonly attribute boolean hidden;
readonly attribute VisibilityState visibilityState;
attribute EventHandler onvisibilitychange;
};
扩展 本规范扩展了文档接口,如下所示:
enum VisibilityState {
"hidden", "visible"
};
partial interface Document {
readonly attribute boolean hidden;
readonly attribute VisibilityState visibilityState;
attribute EventHandler onvisibilitychange;
};
为了改善用户体验、优化CPU和电源效率,应用程序可以在应用程序运行时自动播放视频,并在应用程序运行时自动暂停播放: 此外,@MichaelMahemoff在这篇文章中进一步指出,多标签浏览现在是一种常态,你不能仅仅因为你的应用程序正在运行而假设用户正在观看它,而新的页面可见性API让你的应用程序发现它是否可见。您可以使用API来减少不必要的网络活动和计算。如果您正在使用任何当前的Chrome或Chrome版本,如果当前页面通过
document.webkitHidden
隐藏,您可以在控制台中试用。但是,document.webkitVisibilityState
将返回一个字符串,指示当前状态,可见
、隐藏
和预渲染
中的一个。当这些更改中的任何一项发生时,例如当用户打开应用程序的选项卡或离开它时,将触发一个新的webkitvisibilitychange
事件
解决方案 所有这些交互都可以使用来观察,它是页面可见性API的包装,允许您确定您的网页对用户可见还是隐藏在后台选项卡或预呈现中。它还允许您在JavaScript逻辑中使用页面可见性状态,并通过禁用不必要的计时器和AJAX请求来提高浏览器性能,或改善用户界面体验(例如,当用户切换到另一个浏览器选项卡时停止视频播放或幻灯片放映) 特定于Firefox的解决方案:另一种特定于Firefox的解决方案是使用Firefox扩展,该扩展将禁用所有页面的API 在这里,您可以找到有关的详细讨论 特定于Chrome的解决方案:另一种特定于Chrome的解决方案是使用Chrome Web应用商店的扩展 在这里,您可以找到有关的详细讨论
如果您的目标是愚弄可见性API,则将此脚本插入到相关页面或框架中:
wait page.evaluate(`
Object.defineProperty(window.document,'hidden',{get:function(){return false;},configurable:true});
Object.defineProperty(window.document,'visibilityState',{get:function(){return'visible';},configurable:true});
window.document.dispatchEvent(新事件('visibilitychange'));
`);
它首先覆盖窗口。hidden
,使其返回false
。然后,它触发visibilitychange
事件,以在页面已隐藏时通知文档
或在创建文档后立即覆盖API:
wait page.evaluateOnNewDocument(`
Object.defineProperty(window.document,'hidden',{get:function(){return false;},configurable:true});
Object.defineProperty(window.document,'visibilityState',{get:function(){return'visible';},configurable:true});
`);
也许您可以模拟或将Puppeter ua_string更改为不支持页面可见性API的浏览器版本?您可以添加Page.on('popup',async(Page)=>Page.evaluateOnNewDocument(…)
以支持新窗口/弹出。次要编辑:Page.on('popup',async(Page)=>wait Page.evaluateOnNewDocument(…)
谢谢。愚蠢的是,我没有尝试这个,我认为属性不会被覆盖,但它们是可以覆盖的。我还需要添加e.stopImmediatePropagation();e、 停止传播();e、 预防默认值();对于“blur”事件,我设法使它完全工作。有人能提供一个代码示例,说明如何为blur事件添加stopImmediatePropagation()等吗?