标签: chrome-devtools-protocol

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

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

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

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

Network.enable
Network.setRequestInterception
Run Code Online (Sandbox Code Playgroud)

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

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

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

google-chrome google-chrome-devtools chrome-devtools-protocol

5
推荐指数
1
解决办法
853
查看次数

Page.createIsolatedWorld grantUniveralAccess 标志不授予通用访问权限

我正在尝试使用 访问跨源 iframe 的 contentDocument Runtime.evaluate。据我了解文档,这应该可以通过使用+ [1] 创建executionContext具有通用访问权限并将返回的值传递给as来实现。Page.createIsolatedWorldgrantUniveralAccess: trueexecutionContextIdRuntime.evaluatecontextId

有任何想法吗?

chromium-browser --user-data-dir=/tmp/headless --remote-debugging-port=9000给定一个从[2]开始的铬工艺。

// See [3] for full code
const frameId = /* frameId of our page with origin localhost:9000 */
function execute(command, args) { /* ... send and receive on websocket */ }

const {executionContextId} = await execute("Page.createIsolatedWorld", {
  frameId: frameId, 
  grantUniveralAccess: true // NOT grantUniversalAccess. Typo in devtools protocol itself [4].
})

// fails with:
// Access to fetch …
Run Code Online (Sandbox Code Playgroud)

puppeteer chrome-devtools-protocol

5
推荐指数
0
解决办法
722
查看次数

用于打开 devtools 窗口的 Chrome 命令行标志已取消停靠

我知道我可以devtools使用以下标志打开 Chrome,并将扩展坞放置在右侧:

--auto-open-devtools-for-tabs
Run Code Online (Sandbox Code Playgroud)

我希望能够dock从命令行修改 的位置。

是否有任何标志或配置允许我将dock启动时放置在我想要的任何地方?

或者,可以使用Chrome Devtools 协议来完成吗?

google-chrome google-chrome-devtools chrome-devtools-protocol

5
推荐指数
1
解决办法
639
查看次数

page._client 在 Puppeteer 中做什么?

我阅读了整个 Puppeteer 文档,但不幸的是,他们没有任何_client有关page.

所以我的问题是,什么是page._client

使用之间有什么区别

await page._client.send('');
Run Code Online (Sandbox Code Playgroud)

client = await page.target().createCDPSession()
await client.send('');
Run Code Online (Sandbox Code Playgroud)

node.js puppeteer chrome-devtools-protocol

5
推荐指数
1
解决办法
6739
查看次数

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

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

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

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

我无法找到有关 Chrome/Chromium 中可以在 Node.js/C#/Java 环境中使用的任何公共 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++ 构建工具方面的能力。

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

chromium chromium-embedded electron puppeteer chrome-devtools-protocol

3
推荐指数
1
解决办法
2287
查看次数

[Selenium 4.0.0-beta-1]:如何在 CDP 中添加事件监听器

我已经从源代码构建并安装了Selenium 4.0.0-beta-1 python 轮来测试CDP功能。具体来说,我想使用Fetch Domain 协议拦截请求。

我可以使用命令启用域Fetch.enable,但我不知道如何订阅Fetch.requestPaused等事件来拦截请求:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

driver = webdriver.Chrome()

# Enable Fetch domain
driver.execute_cdp_cmd('Fetch.enable', cmd_args={})

# How to subscribe to Fetch.requestPaused event??
# driver.add_cdp_event_listener ... 
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

python beta selenium chrome-devtools-protocol

3
推荐指数
1
解决办法
2815
查看次数

Chrome DevTools 协议 addScriptToEvaluateOnNewDocument 使用 ruby​​ chrome_remote

所以我试图注入一个脚本以addScriptToEvaluateOnNewDocument在 chrome 79上使用的任何页面上运行,但它似乎不起作用。

我正在使用 ruby​​ gem chrome_remote,它提供了对 CDP 的基本访问。

这是一个示例红宝石:

scpt =<<EOF
    window.THIS_WAS_SET = 1
EOF

ChromeRemote.client.send_cmd 'Page.addScriptToEvaluateOnNewDocument',{source: scpt}
ChromeRemote.client.send_cmd "Page.navigate", url: "http://localhost:4567/test"
Run Code Online (Sandbox Code Playgroud)

然后我开始铬 --remote-debugging-port=9222

Page.addScriptToEvaluateOnNewDocument总是返回{"identifier"=>"1"}(即使我把它称为多次,不同的脚本说)。

当我在 Chrome 中打开的选项卡上打开控制台时(它可以工作,所以我知道 CDP 通常正在工作),并检查 的值window.THIS_WAS_SET,它是未定义的。

有什么方法可以验证命令是否发送到浏览器,例如在浏览器中接收到的日志?有什么办法可以查看注入了哪些脚本?为什么每次调用总是返回ScriptIdentifier1,这似乎有问题?

有人有类似的例子吗?

ruby chrome-devtools-protocol

0
推荐指数
1
解决办法
822
查看次数