node.js - Puppeteer page.click 在 headless 模式下不起作用

标签 node.js puppeteer

有什么问题
我尝试使用 Puppeteer 单击某个元素,我同时尝试了 page.clickpage.evaluate在这个任务上。

  • 如果在 headless=false模式,两种方法都运行良好。
  • 如果在 headless=true模式,page.evaluate有效,但 page.click永远挂起。

  • 我当时所做的是page.waitForSelector明确表示 page.click 之前的元素,见下面的代码。
    看起来像 waitForSelector也永远挂起。
    谁能帮我理解为什么它卡在 headless 模式下?
    环境
    chrome version is HeadlessChrome/80.0.3987.0
    puppeteer version 2.1
    macOS catalina 10.15.3
    
    代码
    
    const pptr = require('puppeteer');
    
    console.log(pptr.version);
    
    (async () => {
        var br = await pptr.launch({
            headless: true,
            defaultViewport: null,
            args: [
                '--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
                '--user-data-dir=/tmp/user_data/',
            ],
        });
        var page = await br.newPage();
        var url = 'https://www.lookfantastic.com/brands/aesop/view-all.list';
        var css = 'div.responsiveProductListPage_topPagination button[aria-label="next page" i]:not([disabled])';
    
        const chrome_version = await page.browser().version();
        console.log(`chrome version is ${chrome_version}`);
    
        await page.goto(url);
        await page.waitForSelector(css, { visible: true });  // when headless=true, hangs here.
    
        await Promise.all([
            page.click(css),
            //page.evaluate((css) => { document.querySelector(css).click(); }, css),
            page.waitForNavigation({waitUntil: 'networkidle0'}),
        ]);
        console.log('success');
        await new Promise(r => setTimeout(r, 1000));
        await br.close();
    })();
    
    

    最佳答案

    根据您的评论, headless 屏幕的大小可能不适合您正在测试的元素。此元素是否应该显示在笔记本电脑大小的屏幕上(在您的情况下,宽度 > 1200 像素)?

    您可以使用选项 --window-size=width,height 设置 Puppeteer 的窗口大小。 , 例如:

    args: [
                '--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
                '--user-data-dir=/tmp/user_data/',
                '--window-size=1200,800',
            ],
    

    关于node.js - Puppeteer page.click 在 headless 模式下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60905999/

    相关文章:

    javascript - 无法读取未定义的属性 'isDirectory'

    javascript - Node Stream - 将多个 Transform 流输出到单个 PassThrough 流

    javascript - 如何使用 puppeteer 对模拟设备执行拖动缩放

    Puppeteer - 如何与新窗口交互或强制新窗口进入同一实例

    javascript - 将 Network.requestIntercepted 与 Puppeteer 结合使用

    javascript - PhantomJS 在弹出窗口中执行 JavaScript 以进行数据提取

    javascript - sass 加载器不会将 scss 转换为 css

    node.js - 在 redis 键/值中搜索多个值

    javascript - 使用 puppeteer API 生成 pdf 时无法捕获图像

    javascript - 捕获 waitForSelector 错误