由于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。
答案 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
。
$
答案 2 :(得分:0)
await elementHandle.contentFrame()为空:
const frame = await elementHandle.contentFrame();