美文网首页
从 chrome devtools protocol 再看 Ch

从 chrome devtools protocol 再看 Ch

作者: 阿克伦之子 | 来源:发表于2021-11-14 13:40 被阅读0次

之前简单的描述了Chrome Devtools的一些使用技巧,不过慢慢就会想想Chrome Devtools原理是什么呢 ?

一个简单的例子,我们用谷歌控制台去调试页面样式,页面可以根据调整的样式动态去变化,这是为啥?

这一切都可以 **[chrome devtools protocol](https://chromedevtools.github.io/devtools-protocol//)** 来解释。 Chrome DevTools Protocol  允许使用工具来检测、检查、调试和分析 Chromium、Chrome 和其他基于 Blink 的浏览器。 许多现有项目目前使用该协议。并且Chrome DevTools 使用此协议。因为功能比较多,所以分了多个域(一般复杂的东西都会分域),包括 DOM、Debugger、Network、Page 等等,分别放不同的调试协议。

新版 chrome可以打开设置中的实验特性的 Protocol Monitor 面板。


选择之后可以查看一下下,如果没有点击右侧三个点 然后里面有More tools进行添加。

一起⭕猜⭕一下上面css调试的整个过程。

  1. 修改了font-size的属性
  2. 3、4、5 等等发送了修改的请求
  3. 2是最后修改的300px,因为动态监听了这个所以发送了很多次 setStyleTexts 方法。
  4. 对照着 协议api可以了解到。
  5. 本质上就是在修改属性的时候 其实向 浏览器调试控制台发送request ,浏览器内部进行处理 并且给出状态。


这个仅仅是冰山一角的一角,可能会问了解这个有啥作用呢?

  1. 一方面 往高级点方向说就是 可以实现 CDP 服务端,来对接 chrome devtools 的调试功能,调试不同的目标,也可以通过 sdk 的 api 来和 CDP 服务端对接,拿到数据,实现调试的功能。比如单独实现 DOM 编辑器、Network 查看器、JS Debugger。
  2. 另一方面 还是返璞归真一些、能够了解一些浏览器工作原理、了解DOM树、了解CSS的一些知识、了解到请求是什么构成的?等等等很多

我们一起来来实验下:

1. 打开谷歌浏览器所在的文件位置 然后终端打开 输入 ./chrome --remote-debugging-port=9222 --headless 可以看到调试模式已经打开。可以将远程页面连入了。

2. 为了更好的看到一些效果,我用本地页面来进行, 这里需要注意的是 需要进行安装一下chrome-remote-interface 提供了一些简单的api。

下面代码意思很明显,先是navigate到给定URL的当前页面、通过页面上captureScreenshot 方法 获取当前页面的截图。这个方法可以传入很多参数。

打开谷歌浏览器 输入 ``chrome://inspect/#devices` 发现有一个远程页面了。

const CDP = require('chrome-remote-interface')
const fs = require('fs')

async function cdpTest() {
    let client
    try {
        client = await CDP()
        const {Page, DOM, Debugger, Network, CSS, Log, Browser} = client

        await Page.enable()
        await Page.navigate({url: 'http://localhost:63342/chrome-debugger-test/test.html?_ijt=j6tk8fq253465uofikto2bsqjb'})

        const res = await Page.captureScreenshot()
        fs.writeFileSync('./screenshot.jpg', res.data, {
            encoding: 'base64'
        })

    } catch (err) {
        console.error(err)
    }
}

3. 通过这个协议继续查看一下页面中DOM元素 将这部分代码加入到上面代码的主体中。调试可以发现下面的整个文档的信息。等等,这是DOM树嘛?

然后找到其中一个DOM元素 通过getAttributes 获取属性查看一下。可以看到下面的信息。等等,怎么是数组的形式?
还有很多很多的api...

        // 启用 DOM 代理
        await DOM.enable()
        // 获取整个树结构
        const {root} = await DOM.getDocument({
            depth: -1
        });
        console.log(root)
        const result = await DOM.getAttributes({nodeId: 13});
        console.log(result)

4. 继续往下去看看 CSS 部分在获取CSS信息之前需要等待DOM代理开启。通过getComputedStyleForNode方法获取元素的计算过后的样式。然后看到了写的color 变成了RGB形式存储了。元素面板右侧里面有个Computed。是不是正好对应?

// 页面中 class container 设置了颜色
.container{
        color: #032dff;
 }
  await CSS.enable()
  const nodeCssInfo = await CSS.getComputedStyleForNode({nodeId: 13})

5. 继续看看网络方面,我在页面中引入了JQ 然后发送了一个请求。然后可以看到一些信息。

  await Network.enable();
   //网络  requestWillBeSent->当页面即将发送HTTP请求时触发。
   Network.requestWillBeSent((params) => {
            console.log(params.request.url)
   });

6. 还有很多好玩的api。快来参与参与。

相关文章

网友评论

      本文标题:从 chrome devtools protocol 再看 Ch

      本文链接:https://www.haomeiwen.com/subject/tktxtrtx.html