问题标签 [chrome-devtools-protocol]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
409 浏览

lighthouse - 有没有办法使用 Chrome DevTools 协议运行 Lighthouse 审计?

我想以编程方式运行Lighthouse审计。我找到了多个关于如何使用 Puppeteer 完成此任务的示例。但是,有没有办法使用Chrome DevTools 协议运行 Lighthouse 审计?

0 投票
1 回答
1780 浏览

puppeteer - 有没有办法触发标准缩放(不是无头)

我正在关闭无头模式运行 puppeteer,以便自动化和远程控制另一台计算机上的可见 Chromium 浏览器。

有没有办法像在 UI 菜单或ctrl +/crtl -命令中一样触发或模拟浏览器上的缩放?

注入 CSS 或使用各​​种记录在案的缩放命令并不能完全复制这一点,例如,使用vh/vw单位定义的元素不会得到调整。


我目前的解决方案

使用视口缩放在Emulation.setDeviceMetricsOverride缩小时效果很好,但它似乎是在调整页面光栅的大小而不是以目标大小呈现,导致放大时文本模糊。

调整视口大小并使用Emulation.setPageScaleFactor适用于放大,但是在我的测试中似乎忽略了小于 1 的 pageScaleFactor。

这两种解决方案的一个问题是,它需要提前知道浏览器窗口的宽度/高度,并且依赖于不改变,而不是具有流畅的视口。我也不确定我缺少标准浏览器缩放的其他哪些功能。

我的缩放代码现在是:

有一个更好的方法吗?

0 投票
0 回答
65 浏览

google-chrome - Chrome 开发工具跟踪文件的完整事件中“dur”的总和

我有来自 chrome 开发工具的跟踪文件,用于我的 Web 应用程序的特定工作流程。我试图弄清楚工作流程所花费的总时间。

我正在使用 Puppeteer 脚本和它的跟踪功能来执行此操作。我通读了跟踪文件 JSON,按阶段类型过滤 - 'X' 是完整事件。过滤后,我总结了所有“dur”字段,我相信这应该给我工作流程的总时间。

结果却大相径庭。总持续时间太大了,甚至无法考虑远程接近我在屏幕上可以看到的内容。

假设这个时间是毫秒微秒(在 JSON 的任何地方都没有提到它,除了在本文末尾链接的文档中)

我还需要过滤任何其他字段吗?(可能重复?

参考:https ://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview#

0 投票
1 回答
1062 浏览

google-chrome - Chrome DevTools 协议 - 拦截和修改 websocket 请求

我正在尝试使用Chrome DevTools Protocol( CDP) 来拦截 Web 请求并对其进行修改。

问题是我需要修改 WebSocket 请求的标头。这可能吗?

我可以通过首先发送消息轻松修改“正常”请求的标头:

然后收听Network.requestIntercepted消息并回复适当的Network.continueInterceptedRequest消息。

但是,Network.requestIntercepted不会为 WebSockets 调用。我可以听,Network.webSocketWillSendHandshakeRequest但这只能让我阅读请求,我看不到任何修改它的方法。

有没有办法做到这一点,或者目前这是不可能的?

0 投票
0 回答
650 浏览

google-chrome-devtools - 关于 Chrome 开发工具中的系统时间

Chrome 开发工具性能选项卡的 Summery 饼图中的 System time 和 Others time 有什么区别,特别是 System time 指的是什么?

0 投票
1 回答
1428 浏览

electron - 以编程方式控制 Chromium 实例的最可靠方法是什么?

我正在研究以编程方式控制 Chrome/Chromium 实例的可靠方法,以利用其在 Node.js/C#/Java 应用程序中呈现网页的功能。简而言之,我想做的事情如下:

  • 打开/关闭浏览器窗口。
  • 最小化、最大化浏览器窗口。
  • 导航到某个 URL。
  • 设置饼干。

更清楚地说:我需要一个有头的浏览器来向最终用户显示网页。它可以嵌入到我的应用程序中,也可以是独立的浏览器(例如单独发布的 Chromium 实例)。

我无法从 Node.js/C#/Java 环境中找到有关 Chrome/Chromium 中任何公共 API 的信息。可用于 Chrome 扩展的那些不适用于我的项目,因为我想从外部控制浏览器,例如 Selenium WebDriver。到目前为止,我找到了以下方法来按照我需要的方式控制浏览器:

  1. 使用 Puppeteer/WebDriver API。
  2. 使用 chrome-remote-interface NodeJS 库。
  3. 依靠 Chrome 嵌入式框架功能。
  4. 依赖 Electron.js 的能力。
  5. 构建我自己的库,以某种方式包含 Chromium 模块作为依赖项(例如,类似于 Electron 团队实现的)。

从最终利用 Chrome Devtools 协议的所有提到的库的角度来看,前两个选项是相似的。CDP 被淘汰/弃用的风险对我们的项目来说是相当大的。另一个问题是 CDP 的目的是调试和测试自动化,而不是应用程序开发。此外,在用户机器上打开 Chrome 中的开放调试端口似乎很容易受到攻击。

由于依赖于嵌入式 Chromium 更新节奏,CEF 和 Electron 路径让我很担心。尽管 Electron 团队的目标是更新 Chromium 的所有其他版本,但由于无法在带有安全补丁的新版本发布后立即更新 Chromium 版本,它仍然可能是一个安全问题。此外,如果我需要真正的浏览器体验(就是这种情况),我不会开箱即用,我必须自己实现按钮、标签、地址栏等浏览器功能。

选项#5 的实现似乎极其复杂,因为它似乎需要团队在 Chromium 内部、C++ 开发和 C++ 构建工具方面的能力。

我在选项列表中遗漏了什么?我在假设中遗漏了什么?任何提示,想法,建议将不胜感激!

0 投票
0 回答
337 浏览

websocket - 使用 Puppeteer 记录二进制 WebSocket 数据

我正在尝试使用 Puppeteer 记录通过 WebSocket 流式传输的实时数据。我已经按照如何使用 puppeteer 转储 WebSocket 数据的说明进行操作,但到目前为止还没有运气。Network.webSocketFrameReceived永远不会触发回调。我尝试为Network.webSocketFrameSent和其他 websocket 事件做同样的事情,但没有一个被触发。

DEBUG=puppeteer:*尽管记录了 HTTP/Fetch 事件,但我已经运行 puppeteer并且没有看到 websocket 事件。CDP 对二进制 websocket 有限制吗?

使用最新稳定版 Pupeeteer (1.20.0)

0 投票
1 回答
292 浏览

google-chrome - 如何解析谷歌浏览器性能记录文件

使用 puppeteer 我录制了网站的表演文件

如何自动解析此文件以获得结果,例如在性能选项卡中的“加载、脚本、渲染等”。

0 投票
0 回答
409 浏览

docker - 在 docker 网格中访问 c​​hrome devtools 协议

我的测试是针对带有用于集线器和 chrome 的 selenium docker 图像的 docker 网格运行的。我想要做的是访问 chrome 节点中的 chrome devtools 协议,以便我可以访问/拦截请求。感谢任何帮助

我能够在本地没有 docker 的情况下让它工作。但无法找到连接 docker 网格 chrome 节点中的 devtools 的方法。下面是我的 docker-compose 和代码

码头工人撰写

这是我如何在没有网格的情况下在本地工作的示例代码(我的 mac 中的 chrome 驱动程序)

当它是网格时,我只是将构建驱动程序的方式更改为下面

这样我得到了端口号,但无法创建 CDP 会话,并且出现连接被拒绝错误。

0 投票
1 回答
5887 浏览

selenium - 如何在 Selenium 中使用 Chrome DevTools 协议(使用 Python)来捕获 HTTP 请求和响应?

我知道这Fetch Domain是用于此目的,但我不知道我该如何实现它。在 Selenium python 中,我使用以下代码来启用requestPaused事件的发布。

但我不知道如何处理requestPaused事件(我需要调用一个fulfillRequestcontinueRequest/ continueWithAuth)。结果,我的程序停止工作。如果有人能给我提供一个例子来帮助我理解它是如何工作的,我真的很感激。