You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Puppeteer点击iframe内按钮失败,请求技术协助

问题修复方案

核心问题分析

你遇到的Cannot read properties of undefined (reading '$')错误,本质是找不到指定的iframe,同时代码还存在几个关键问题:

  • 错误假设Cookie弹窗在iframe中(实际该网站的Cookie按钮位于主文档内)
  • CSS选择器写法错误
  • 使用不可靠的setTimeout等待,而非Puppeteer原生的元素等待API
  • 代码存在语法错误

修复后的完整代码

import puppeteer from 'puppeteer-extra';
const url = "https://eenewseurope.com";
const timeout = 200000;

async function getNews () {
    const browser = await puppeteer.launch({
        executablePath: '/usr/bin/chromium-browser',
        timeout: 20000,
        headless: false // 可选:打开可视化窗口方便调试
    });

    const page = await browser.newPage();

    await page.setViewport({
        width: 1920,
        height: 1080,
        deviceScaleFactor: 1,
    });

    await page.goto(url, {
        waitUntil: "networkidle0",
        timeout: timeout,
    });

    // 等待Cookie同意按钮加载完成,最多等待10秒
    await page.waitForSelector('.cmplz-btn.cmplz-accept', { timeout: 10000 });
    // 点击同意按钮
    await page.click('.cmplz-btn.cmplz-accept');

    // 后续可添加订阅弹窗处理或内容爬取逻辑
    // 示例(处理订阅弹窗):
    // try {
    //     await page.waitForSelector('订阅弹窗关闭按钮选择器', { timeout: 5000 });
    //     await page.click('订阅弹窗关闭按钮选择器');
    // } catch (e) {
    //     console.log('订阅弹窗未出现');
    // }

    // 记得完成操作后关闭浏览器
    // await browser.close();
}

getNews().catch(err => console.error(err));

关键修复点说明

  1. 移除多余语法:原代码getNews函数末尾多了一个};,导致语法错误,已删除。
  2. 修正选择器:原选择器cmplz-btn cmplz-accept是后代选择器,实际按钮同时拥有这两个类,正确写法为.cmplz-btn.cmplz-accept(类选择器用.,多类直接拼接无空格)。
  3. 替换不可靠等待:用page.waitForSelector替代setTimeout,确保按钮加载完成后再执行点击,避免页面加载速度差异导致的元素找不到问题。
  4. 取消iframe查找:该网站的Cookie弹窗不在iframe内,直接在主页面操作即可。
  5. 异步操作加await:page.click是异步方法,必须添加await确保操作执行完成。

内容的提问来源于stack exchange,提问作者Denis D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:07:15