我正在尝试使用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
我正在尝试使用 访问跨源 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) 我知道我可以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
我阅读了整个 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) 我正在研究以编程方式控制 Chrome/Chromium 实例的可靠方法,以利用其在 Node.js/C#/Java 应用程序中渲染网页的功能。简而言之,我想做的事情如下:
为了更清楚地说:我需要一个有头脑的浏览器来向最终用户显示网页。它可以嵌入到我的应用程序中,也可以是独立的浏览器(例如单独提供的 Chromium 实例)。
我无法找到有关 Chrome/Chromium 中可以在 Node.js/C#/Java 环境中使用的任何公共 API 的信息。适用于 Chrome 扩展的扩展不适用于我的项目,因为我想从外部控制浏览器,就像 Selenium WebDriver 所做的那样。到目前为止,我找到了以下方法来按照我需要的方式控制浏览器:
从最终利用 Chrome Devtools 协议的所有提到的库的角度来看,前两个选项是相似的。对于我们的项目来说,CDP 退休/弃用的风险相当大。另一个问题是 CDP 的目的是调试和测试自动化,而不是应用程序开发。此外,在用户计算机上打开 Chrome 中的开放调试端口似乎很容易受到攻击。
由于依赖于嵌入式 Chromium 更新节奏,CEF 和 Electron 路径引起了我的关注。尽管 Electron 团队的目标是与 Chromium 的所有其他版本一起更新,但它仍然可能是一个安全问题,因为例如在带有安全补丁的新版本发布后无法立即更新 Chromium 版本。此外,如果我需要真正的浏览器体验(就是这种情况),我不会开箱即用,我必须自己实现浏览器功能,如按钮、选项卡地址栏等。
选项 #5 的实现似乎极其复杂,因为它似乎需要团队在 Chromium 内部、C++ 开发和 C++ 构建工具方面的能力。
选项列表中我错过了什么吗?我的假设中遗漏了什么吗?任何提示、想法、建议将不胜感激!
chromium chromium-embedded electron puppeteer chrome-devtools-protocol
我已经从源代码构建并安装了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)
谢谢你的帮助!
所以我试图注入一个脚本以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,这似乎有问题?
有人有类似的例子吗?