使用Devtools协议事件Page.frameNavigated获取客户端侧导航重定向

时间:2018-03-12 14:31:59

标签: javascript google-chrome-devtools puppeteer google-chrome-headless

Devtools协议中的framenavigated事件似乎与Puppeteer中的framenavigated事件的工作方式不同。如果我在下面的Puppeteer示例中使用parentframe方法,我只得到客户端导航重定向,这是我想要的。如果我使用Devtools协议示例将parentframe方法替换为parentId我没有得到任何结果,因为代码没有超过parentId

如何在Devtools协议中使用framenavigated事件的行为方式与Puppeteer framenavigated相同,并且只获取导航重定向链?

// var url = "http://wechat.com";
var url = "http://yahoo.com";

const puppeteer = require('puppeteer');

puppeteer.launch().then(async browser => {
const page = await browser.newPage();

// Puppeteer framenavigated example:
page.on('framenavigated', frame => {
 if(frame.parentFrame() === null) {
console.log("Puppeteer nav frame: ");
console.log(frame._url);
}
});
// Result returns:
// Puppeteer nav frame:
// https://uk.yahoo.com/?p=us

// Devtools protocol framenavigated example:
const client = await page.target().createCDPSession();
await client.send('Page.enable');

await client.on('Page.frameNavigated', (e) => {
// console.log("Framenavigated event fired");
if(e.frame.parentId === null) {
    console.log("Devtools protocol frame: ");
    console.log(e.frame.url);
 }
});
// Result returns: 
// Either hangs up and times out or finishes but returns nothing

await page.goto(url);
await browser.close();

});

1 个答案:

答案 0 :(得分:0)

再看看这个并找出问题所以我会回答我自己的问题。

Puppeteer中的parentFrame()方法返回null作为页面主框架的一部分的框架,但Devtools protcol中的parentId返回undefined作为主框架。因此,我只需要检查undefinedfalse parentId值。很明显我知道@@。

await client.on('Page.frameNavigated', (e) => {
    if(!e.frame.parentId) {
    // if(typeof e.frame.parentId === "undefined") { // works also
    console.log(e.frame.url);
    }
});