日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

cdp协议简介

發布時間:2023/12/31 综合教程 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 cdp协议简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

啥是cdp

根據官網的說法,cdp(Chrome DevTools Protocol) 允許我們檢測,調試Chromium, Chrome 和其他基于 Blink的 瀏覽器. 這個協議被廣泛使用. 其中最著名的是 Chrome DevTools,協議的api也由這個團隊維護。

使用cdp的姿勢

如果在瀏覽器中,當你打開devtools時,其實你已經在使用cdp了,只是感知不深罷了,一種辦法可以更直觀的感知cdp,就是打開devtools的devtools,具體操作如下:

將開發者工具設置為獨立窗口,dock side點第一個

在開發者工具上再使用快捷鍵ctrl+shift+i,就可以打開開發者工具的開發者工具了,現在在新打開的開發者工具的console里面,輸入下面的代碼:

let Main = await import('./main/main.js');
Main.MainImpl.sendOverProtocol('Runtime.evaluate', {expression: 'alert (12345)'});

這時網頁會alert 12345,你會發現平時在控制臺簡單的代碼執行,其實是通過cdp遠程調用網頁的js引擎去執行再返回結果的。

除此之外,protocol monitor也可以幫助我們更直觀的理解cdp。

幾個重要的URL

當一個頁面暴露出它的remote debugging port時,我們就可以借助cdp來對這個網頁進行remote debugging了。由于cdp是借助websocket實現的,所以,在一切開始之前,有兩個url是比較重要的
http://localhost:[port]/json/list
http://localhost:[port]/json/version
這兩個url,可以讓我們拿到網頁的websocket url,json/list返回的數據類似于:

[
{
description: "",
devtoolsFrontendUrl: "/devtools/inspector.html?ws=localhost:8080/devtools/page/a31c4d5c-b0df-48e8-8dcc-7c98964e2ebe",
id: "a31c4d5c-b0df-48e8-8dcc-7c98964e2ebe",
title: "",
type: "page",
url: "xxx://xxx",
webSocketDebuggerUrl: "ws://localhost:8080/devtools/page/a31c4d5c-b0df-48e8-8dcc-7c98964e2ebe"
}
]

其中webSocketDebuggerUrl就是我們需要的打開remote debugging 的鑰匙

重頭戲websocket

接下來我們連上ws,就可以愉快的遠程操作頁面了,正如chrome devtools所做的那樣,下面是一個例子:

const WebSocket = require('ws');
const puppeteer = require('puppeteer');

(async () => {
  // Puppeteer launches browser with a --remote-debugging-port=0 flag,
  // parses Remote Debugging URL from Chromium's STDOUT and exposes
  // it as |browser.wsEndpoint()|.
  const browser = await puppeteer.launch();

  // Create a websocket to issue CDP commands.
  const ws = new WebSocket(browser.wsEndpoint(), {perMessageDeflate: false});
  await new Promise(resolve => ws.once('open', resolve));
  console.log('connected!');

  ws.on('message', msg => console.log(msg));

  console.log('Sending Target.setDiscoverTargets');
  ws.send(JSON.stringify({
    id: 1,
    method: 'Target.setDiscoverTargets',
    params: {
      discover: true
    },
  }));
})();

更多例子可以在這里

jsonRPC

如上面例子所示,當ws連接后,一個發給瀏覽器的指令大概包括3部分id,method,params,比如一個執行一段console.log('hello')代碼的指令:

{
  "id": 235,
  "method": "Runtime.evaluate",
  "params": {
    "expression": "console.log('hello');",
    "objectGroup": "console",
    "includeCommandLineAPI": true,
    "silent": false,
    "contextId": 1,
    "returnByValue": false,
    "generatePreview": true,
    "userGesture": true,
    "awaitPromise": false
  }
}

chrome devtools可以完成的功能非常龐大,而這些功能基本都是使用這樣的一個個指令實現的,讓人想起那句古老的中國名言:九層之臺,起于壘土。本文完

參考資料:
https://chromedevtools.github.io/devtools-protocol
https://github.com/aslushnikov/getting-started-with-cdp/blob/master/README.md

總結

以上是生活随笔為你收集整理的cdp协议简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。