2

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

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

和使用有什么区别

await page._client.send('');

client = await page.target().createCDPSession()
await client.send('');
4

3 回答 3

1

按照 JS 约定,以下划线为前缀的字段和方法_client是“私有的”,不应依赖。这几乎肯定也是它没有被记录的原因。您使用它需要您自担风险。在更新版本的 puppeteer 中,这个字段可能会消失或做一些完全不同的事情。

较新的 JavaScript 具有适当的私有字段和方法(#在类定义中以 为前缀),因此 puppeteer 很可能很快会将这些字段转换为适当的私有字段。

于 2021-06-05T22:09:43.807 回答
0

page._client由 puppeteer 类在内部使用。正如人们在上面指出的那样,最好避免使用page._client,因为它是一个私有 API。

创建您自己的 CDP 会话page.target().createCDPSession()以直接访问 chrome devtools 协议。当您使用 时,事情可能会奏效page._client,但是当您开始尝试自己实现 devtools 协议的一些低级功能时,将会出现一些没有在任何地方记录的冲突和错误,您将被遗弃挠头想知道 chrome devtools 是否如此损坏。

此错误的示例就像您可以尝试直接使用 Fetch 域进行代理身份验证,而不是使用page.authenticate(...). 事情将要崩溃,您将尝试搜索无处可寻的错误,查看 puppeteer 源代码,发现您没有做任何不同的事情,但猜猜看,因为您使用page._client.send(...)而不是创建自己的CDPSession,您将付出一整天调试代码的代价。

@see:https ://github.com/puppeteer/puppeteer/blob/v10.4.0/docs/api.md#class-cdpsession

于 2022-02-10T20:21:19.193 回答
0

没有文档page._client

避免page._client,因为它是私有 API。

您可以使用 await 获取客户端对象page.target ()

于 2021-06-05T23:52:26.627 回答