puppeteer 无法获取 iframe的解决办法

问题描述:

puppeteer 无法获取到指定的 iframe

使用 puppeteerpage 获取页面 iframe 的时候,有时候可能获取不到自己想要的iframe,但是页面中其他 iframe 能获取到。


解决方案:

args 添加 --disable-features=site-per-process

const newBrowser = async () => {
  init = true;
  let findChromePath = await findChrome({});
  let executablePath = findChromePath.executablePath;

  browser = await puppeteer.launch({
    executablePath,
    headless: false,
    devtools: false, // F12打开控制台
    args: [
      `--disable-extensions-except=/Users/mac/project/dev/puppeteer/extend`, // 不屏蔽这个插件 mac
      // `--disable-extensions-except=C:/Users/Administrator/Desktop/rechargenew`, // 不屏蔽这个插件 window
      `--window-size=${width},${height}`, // 窗口大小
      '--disable-features=site-per-process', // 添加这个
      `–disable-gpu`
    ],
    defaultViewport: { width: width, height: height } // 页面大小
  });

  page = await browser.newPage();

  newhtml()
}

原因分析:

我在别人的资料中,找到这么一段

site-per-process
目前 Chromium 默认的进程模型叫做 process-per-site-instance (还有其他的进程模型如 process-per-site 和 process-per-tab)[3]。这个进程模型基本上就是为每个页面创建一个进程,但是还是存在不同的网站用同一个进程的情况,如 iframes 和父页面,同一个标签页里的页面跳转,以及标签页过多的时候等。Site isolation 引入了一个新的策略叫做 site-per-process。这个策略更为严格,只要是不同的网站,不管你是在新的标签页打开,还是在同一个标签页跳转,还是嵌在 iframes 里,统统都要换一个新的进程。这里主要的工作量是把 iframes 给拿出来放到不同的进程里(所谓的 OOPIF, out of process iframe)。

使用同一个协议,同一个注册域名 (所谓的 eTLD+1) 的网址都属于同一个网站,这比同源策略里的 same origin 要宽泛一些,不同的子域名,不同的端口都算同一个网站。

说明我当前的 Chromium中 是默认开启 site-per-process 的,必须手动禁用它。
具体的解释还需要翻翻 Chromeium 开源的文档


微信群大佬都在等着你

微信扫描二维码加入微信群,交流学习,及时获取代码最新动态。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值