木偶:浏览器断开后,Chromium实例在后台仍处于活动状态

大卫·巴顿

我的环境

  • 木偶版:3.1.0
  • 平台/操作系统版本:Windows 10
  • Node.js版本:12.16.1

我的问题是:

我有一个for...of循环可以访问puppeteer的3000多个网址。我习惯了puppeteer.connectwsEndpoint所以我可以重用一个浏览器实例。每次访问后我都会断开连接并关闭标签。

  • 前100个page.goto网址立即打开网址,
  • 超过100page.goto个,每个网址使用2-3次重试,
  • 超过300page.goto个,每个网址使用5-8次重试,
  • 超过500,我TimeoutError: Navigation timeout of 30000 ms exceeded一直都有。

我检查了Windows任务管理器,并意识到数百个Chromium实例在后台运行,并且每个实例使用80-90MB的内存以及1-2%的CPU。

我该如何杀死已经断开连接的Chromium实例browser.disconnect呢?

示例脚本

const puppeteer = require('puppeteer')
const urlArray = require('./urls.json') // contains 3000+ urls in an array


async function fn() {
  const browser = await puppeteer.launch({ headless: true })
  const browserWSEndpoint = await browser.wsEndpoint()

  for (const url of urlArray) {
    try {
      const browser2 = await puppeteer.connect({ browserWSEndpoint })
      const page = await browser2.newPage()
      await page.goto(url) // in my original code it's also wrapped in a retry function

      // doing cool things with the DOM

      await page.goto('about:blank') // because of you: https://github.com/puppeteer/puppeteer/issues/1490
      await page.close()
      await browser2.disconnect()
    } catch (e) {
      console.error(e)
    }
  }
  await browser.close()
}
fn()

错误

通常的操纵up超时错误。

TimeoutError: Navigation timeout of 30000 ms exceeded
    at C:\[...]\node_modules\puppeteer\lib\LifecycleWatcher.js:100:111
  -- ASYNC --
    at Frame.<anonymous> (C:\[...]\node_modules\puppeteer\lib\helper.js:94:19)
    at Page.goto (C:\[...]\node_modules\puppeteer\lib\Page.js:476:53)
    at Page.<anonymous> (C:\[...]\node_modules\puppeteer\lib\helper.js:95:27)
    at example (C:\[...]\example.js:13:18)
    at processTicksAndRejections (internal/process/task_queues.js:97:5) {
  name: 'TimeoutError'
}

大卫·巴顿

最终,我通过在启动时添加--single-process--no-zygoteargs达到了预期的结果--no-sandbox它们需要+ )。

正在运行的Chromium进程的数量不再呈指数级增长,但是只有两个实例保持活动状态:其中一个是通常位于第一个位置的空选项卡,第二个被正确地重用puppeteer.connect({ browserWSEndpoint })

[...]
  const browser = await puppeteer.launch({
    headless: true,
    args: ['--single-process', '--no-zygote', '--no-sandbox']
  })
  const browserWSEndpoint = await browser.wsEndpoint()
[...]
  • --single-process:以与浏览器相同的过程运行渲染器和插件[源代码]

  • --no-zygote:禁止使用合子进程来分叉子进程。相反,子进程将被直接派生并执行。请注意,--no-sandbox也应与此标志一起使用,因为沙箱需要合子才能工作。[资源]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

检测浏览器窗口是否处于活动状态,并在窗口再次处于活动状态后启动事件[JavaScript]

如何保持木偶浏览器在后台运行而不跳到前台?

在后台打开Web浏览器

我有一个用例,我需要在测试结束后保持量角器会话以及浏览器实例处于活动状态。有没有办法这样做?

如何在服务器仍处于活动状态的情况下检查浏览器连接?

检查是否使用Android默认浏览器或任何移动浏览器(如果处于活动状态)

如何通过保持webDriver处于活动状态来关闭整个浏览器窗口?

标签或窗口处于非活动状态时,浏览器如何暂停/更改Javascript?

检测浏览器选项卡是否处于活动状态或用户已离开

如何判断浏览器/标签页是否处于活动状态

有没有办法判断浏览器是否处于活动状态?

如何检查浏览器是否在Crossrider中处于活动状态?

如果浏览器选项卡处于活动状态,如何更改 Shopify 标题

在关闭并断开电源后,NIC仍处于活动状态

量角器/硒:在后台运行浏览器

从RSelenium调用的浏览器可以在后台运行吗

如何检测浏览器未最小化且相关选项卡未处于活动状态

使用 Selenium 驱动程序加载页面,关闭/处理它并保持浏览器处于活动状态

是否想在浏览器窗口处于活动状态时每次按下按键时读取按键事件并打印按键?

使用 ionic 4 在后台模式处于活动状态时运行功能

python在后台运行任务,同时允许tkinter处于活动状态

浏览器初始化后断开连接

当ParseLoginUI加载微调器处于工作状态时,在后台可见

Twitter认证后如何从后台删除浏览器?

仅当我的应用程序还处于活动状态且在后台运行且未被破坏时,才如何在后台运行BLE扫描?

木偶无法关闭浏览器

木偶浏览器引用列表

如何重用木偶浏览器?

木偶如何确定节点是否处于活动状态?(已更改)