如何在Puppeteer

时间:2019-06-03 00:53:25

标签: javascript node.js iframe puppeteer

由于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。

3 个答案:

答案 0 :(得分:6)

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

您无法使用JavaScript访问其他来源的内容,如果可以的话,这将是一个巨大的安全漏洞。对于同源策略,浏览器会阻止脚本尝试访问具有不同来源的框架。 See more detailed answer here

因此,当我尝试使用伪造者的方法:Page.frames()Page.mainFrame(). ElementHandle.contentFrame()时,我没有向我返回任何iframe。问题在于它正在默默发生,我无法弄清为什么找不到任何东西。

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

答案 1 :(得分:1)

您可以像现在一样使用use DateTime; use DateTime::TimeZone; my $tz = DateTime::TimeZone->new( name => 'Pacific/Honolulu' ); my $dt = DateTime->now(time_zone =>'Pacific/Honolulu'); my $offset = $tz->offset_for_datetime($dt); $timestamp = $dt->hms(':'); $datestamp = $dt->mdy('/'); print "$datestamp at $timestamp\n"; 获取iframe,然后调用contentFrame

$

enter image description here

答案 2 :(得分:0)

await elementHandle.contentFrame()为空:

const frame = await elementHandle.contentFrame();