首页 > 解决方案 > 如何在 Puppeteer 中选择 iframe 元素中的元素

问题描述

由于 ESPN 不提供 API,我正在尝试使用 Puppeteer 来抓取有关我的梦幻足球联赛的数据。但是,由于登录表单与 iframe 元素嵌套,我很难尝试使用 puppeteer 登录。

我去了http://www.espn.com/login并选择了 iframe。除了主要部分之外,我似乎无法选择 iframe 中的任何元素

    frame.$('.main')

这是似乎使用登录表单获取 iframe 的代码。

    const browser = await puppeteer.launch({headless:false});
    const page = await browser.newPage();

    await page.goto('http://www.espn.com/login')
    await page.waitForSelector("iframe");

    const elementHandle = await page.$('div#disneyid-wrapper iframe');
    const frame = await elementHandle.contentFrame();
    await browser.close()

我希望能够访问 iframe 元素中的用户名字段、密码字段和登录按钮。每当我尝试访问这些字段时,都会返回 null。

标签: javascriptnode.jsiframepuppeteerwebautomation

解决方案


您可以contentFrame像现在一样使用 iframe,然后调用$.

const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();

await page.goto('http://www.espn.com/login')

const elementHandle = await page.waitForSelector('div#disneyid-wrapper iframe');
const frame = await elementHandle.contentFrame();
await frame.waitForSelector('[ng-model="vm.username"]');
const username = await frame.$('[ng-model="vm.username"]');
await username.type('foo');
await browser.close()

在此处输入图像描述


推荐阅读