【问题标题】:Puppeteer - Running a function inside a framePuppeteer - 在框架内运行函数
【发布时间】:2019-03-31 12:48:57
【问题描述】:
我试图在 Frame 中执行一个函数但没有成功。
await page.evaluateHandle(()=>{
console.log(window.document.getElementsByTagName("frame")[3].contentWindow)
console.log(window.document.getElementsByTagName("frame")[3].contentWindow.fiAbrePagina)
});
在控制台日志中看到,该函数存在于对象中,但是当我尝试访问该函数时,它并不存在。
查看控制台并检查该函数存在的窗口对象:
我需要帮助,如何在框架内执行函数?
【问题讨论】:
标签:
javascript
node.js
google-chrome-devtools
chromium
puppeteer
【解决方案1】:
您可以使用page.frames() 获取附加到页面的所有框架的数组。然后你可以使用frame.evaluate()在特定框架内的浏览器上下文中执行一个函数。
另外,请确保在页面 DOM 环境中使用 page.on('console') 处理 console.log():
page.on('console', msg => {
for (let i = 0; i < msg.args().length; ++i) {
console.log(`${i}: ${msg.args()[i]}`);
}
});
const frame = page.frames().find(frame => frame.name() === 'example');
await frame.evaluate(() => {
console.log(window.fiAbrePagina);
});
【解决方案2】:
您可以使用框架元素中的contentFrame 来做到这一点,如下所示:
let frameElement = await page.evaluateHandle(() => window.document.getElementsByTagName("frame")[3]);
frameElement = await frameElement.asElement();
const frameContentFrame = await frameElement.contentFrame();
await frameContentFrame.evaluate(() => console.log(fiAbrePagina.toString()));