我阅读了整个 Puppeteer 文档,但不幸的是,他们没有任何_client
关于page
.
所以我的问题是,什么是page._client
?
和使用有什么区别
await page._client.send('');
和
client = await page.target().createCDPSession()
await client.send('');
我阅读了整个 Puppeteer 文档,但不幸的是,他们没有任何_client
关于page
.
所以我的问题是,什么是page._client
?
和使用有什么区别
await page._client.send('');
和
client = await page.target().createCDPSession()
await client.send('');
按照 JS 约定,以下划线为前缀的字段和方法_client
是“私有的”,不应依赖。这几乎肯定也是它没有被记录的原因。您使用它需要您自担风险。在更新版本的 puppeteer 中,这个字段可能会消失或做一些完全不同的事情。
较新的 JavaScript 具有适当的私有字段和方法(#
在类定义中以 为前缀),因此 puppeteer 很可能很快会将这些字段转换为适当的私有字段。
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
没有文档page._client
。
避免page._client
,因为它是私有 API。
您可以使用 await 获取客户端对象page.target ()
。