如何在 Puppeteer 的 iframe 元素中选择元素

Swa*_*ikK 10 javascript iframe webautomation node.js puppeteer

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

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

    frame.$('.main')
Run Code Online (Sandbox Code Playgroud)

这是似乎通过登录表单获取 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()
Run Code Online (Sandbox Code Playgroud)

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

har*_*ded 27

您可以contentFrame像现在一样使用 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 frame.waitForSelector('[ng-model="vm.username"]');
const username = await frame.$('[ng-model="vm.username"]');
await username.type('foo');
await browser.close()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


小智 9

我在查找条纹元素时遇到了问题。原因如下:

您无法使用 JavaScript 访问具有不同来源的内容,如果您可以这样做,这将是一个巨大的安全漏洞。对于同源策略,浏览器会阻止尝试访问具有不同来源的框架的脚本。在此处查看更详细的答案

因此,当我尝试使用 puppeteer 的方法时:Page.frames()并且Page.mainFrame(). ElementHandle.contentFrame()我没有向我返回任何 iframe。问题是它是默默发生的,我不明白为什么它找不到任何东西。

将这些参数添加到启动选项解决了这个问题: '--disable-web-security', '--disable-features=IsolateOrigins,site-per-process'