javascript - Puppeteer 没有正常工作(浏览器未聚焦时暂停/卡住)

标签 javascript node.js puppeteer chromium freeze

我正在使用 Puppeteer.js 来抓取一些 URL。我使用的是 Puppeteer 的默认 Chromium 浏览器。
一切正常,但问题是,当我运行爬虫脚本并在后台执行其他操作时,焦点不再在 Chromium 浏览器上的 Puppeteer,它不起作用:WAITING元素的时间太长,并中止操作,或者换句话说:puppeteer 暂停(或卡住)。

P.S,我也在使用 puppeteer-extrapuppeteer-extra-plugin-stealth用于高级选项的 NPM 包。

以下是我创建浏览器和页面的方式:

async initiateCrawl(isDisableAsserts) {
    // Set the browser.
    this.isPlannedClose = false;
    const browser = await puppeteerExtra.launch({
        headless: false,
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--disable-dev-shm-usage',
            '--start-maximized',
            '--disable-background-timer-throttling',
            '--disable-backgrounding-occluded-windows',
            '--disable-renderer-backgrounding'
        ]
    });
    const pid = browser.process().pid;
    browser.on('disconnected', () => {
        systemUtils.killProcess(pid);
        if (!this.isPlannedClose) {
            systemUtils.exit(Status.BROWSER_CLOSE, Color.RED, 0);
        }
    });
    process.on('SIGINT', () => {
        this.close(browser, true);
    });
    // Set the page and close the first empty tab.
    const page = await browser.newPage();
    const pages = await browser.pages();
    if (pages.length > 1) {
        await pages[0].close();
    }
    await page.setRequestInterception(true);
    await page.setJavaScriptEnabled(false);
    await page.setDefaultNavigationTimeout(this.timeout);
    page.on('request', (request) => {
        if (isDisableAsserts && ['image', 'stylesheet', 'font', 'script'].indexOf(request.resourceType()) !== -1) {
            request.abort();
        } else {
            request.continue();
        }
    });
    return {
        browser: browser,
        page: page
    };
}

我已经看过:
https://github.com/puppeteer/puppeteer/issues/3339
https://github.com/GoogleChrome/chrome-launcher/issues/169
https://www.gitmemory.com/issue/GoogleChrome/puppeteer/3339/530620329

不工作的解决方案:

const session = await page.target().createCDPSession();
await session.send('Page.enable');
await session.send('Page.setWebLifecycleState', {state: 'active'});
const chromeArgs = [
  '--disable-background-timer-throttling',
  '--disable-backgrounding-occluded-windows',
  '--disable-renderer-backgrounding'
];
var ops = {args:[
        '--kiosks',
        '--disable-background-timer-throttling',
        '--disable-backgrounding-occluded-windows',
        '--disable-renderer-backgrounding',
        '--disable-canvas-aa',
        '--disable-2d-canvas-clip-aa',
        '--disable-gl-drawing-for-tests',
        '--disable-dev-shm-usage', 
        '--no-zygote', 
        '--use-gl=desktop', 
        '--enable-webgl',
        '--hide-scrollbars',
        '--mute-audio',
        '--start-maximized',
        '--no-first-run',
        '--disable-infobars',
        '--disable-breakpad', 
        '--user-data-dir='+tempFolder, 
        '--no-sandbox',
        '--disable-setuid-sandbox'
    ], headless: false, timeout:0   };
puppeteer = require('puppeteer');
    browser = await puppeteer.launch(ops);
    page = await browser.newPage();

有没有人以前遇到过这个问题并且知道如何解决这个问题?谢谢。

最佳答案

当我更新到最新的 puppeteer 版本 (9.0.0) 时,我的问题得到了解决。

关于javascript - Puppeteer 没有正常工作(浏览器未聚焦时暂停/卡住),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65932528/

相关文章:

javascript - Puppeteer 同步定义浏览器和页面

docker - 如何在 docker 容器中禁用核心文件转储

firebase - 在 firebase 云函数中运行 puppeteer 代码

javascript - ajax jquery 总是运行错误;

linux - 无法访问亚马逊 AWS 托管的 nodeJs 项目

javascript - 在 Javascript (node js) 中将带有 & 符号的字符串转换为键值映射

node.js - sails 中的一个策略中的多个 Controller

javascript - 为什么这个对象中的变量没有被它的回调函数修改?

javascript - AngularJS Rails 给出空白页面

javascript - 单击 href 和单击复选框时选中复选框