【问题标题】:What does page._client do in Puppeteer?page._client 在 Puppeteer 中做了什么?
【发布时间】:2021-06-05 22:05:56
【问题描述】:

我阅读了整个 Puppeteer 文档,但不幸的是,他们没有任何关于 page_client 属性的文档。

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

和使用有什么区别

await page._client.send('');

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

【问题讨论】:

  • 你可以see in the source code 它是一个 CDPSession 所以显然它是当前会话的私有值。
  • @wOxxOm 使用 _client 返回一个已经创建的 CDPSession 还是创建另一个 CDPSession 更好? page.target() 还返回什么? Puppeteer 没有关于目标是什么的文档

标签: node.js puppeteer chrome-devtools-protocol


【解决方案1】:

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

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

【讨论】:

  • 但是 _client 属性在这种情况下代表什么?我怀疑它可能是与页面关联的默认 CDP 会话,但我不确定。
  • 我的意思是它代表什么并不重要。即使您确实发现了它的含义,它也可能很快意味着其他东西或者只是消失了,所以您不能真正使用它。有什么你认为你需要它的吗?
  • 好吧,Puppeteer 只是 CDP api 的一个包装器,由于它没有完整的覆盖范围,有时您必须依靠私有属性来完成这项工作。我想在不创建新会话的情况下访问当前的 CDP 会话,似乎 _client 返回了当前的 CDP 会话。另外,在我的第二个代码中,我也不明白 target() 这个词在那种情况下是什么意思,这就是为什么在我理解每个人在做什么之前我不想使用它们中的任何一个。
【解决方案2】:

没有page._client 的文档。

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

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

【讨论】:

    【解决方案3】:

    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,您将付出一整天调试代码的代价。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 2012-02-12
      • 2010-10-26
      • 2019-07-12
      • 2010-11-20
      • 2011-07-24
      • 2012-08-07
      相关资源
      最近更新 更多