You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Playwright中拦截滚动式网站的全部页面流量?

解决Playwright无法拦截无限滚动页面后续请求的问题

问题原因

你当前使用的page.route仅会拦截当前页面主框架的请求,而Reddit、TikTok这类无限滚动应用的后续加载请求,可能来自子框架、Service Worker或动态创建的页面上下文,这类请求无法被页面级路由覆盖。

解决方案

方案1:使用浏览器级全局路由(推荐)

通过browser.route设置全局路由,可拦截所有标签页、iframe、Service Worker发起的请求,覆盖所有场景:

import { firefox } from 'playwright';

(async () => {
  // 启动浏览器
  const browser = await firefox.launch();

  // 在创建页面前设置全局路由,确保所有请求都被拦截
  await browser.route('**', async route => {
    // 打印拦截到的请求URL,方便调试
    console.log(`拦截请求: ${route.request().url()}`);
    const response = await route.fetch();
    await route.fulfill({ response });
  });

  const page = await browser.newPage();
  const domain = 'https://www.reddit.com/';
  await page.goto(domain);

  // 模拟无限滚动(可根据需求调整滚动逻辑)
  await page.evaluate(async () => {
    await new Promise(resolve => {
      let scrollTotal = 0;
      const step = 150;
      const timer = setInterval(() => {
        const fullHeight = document.body.scrollHeight;
        window.scrollBy(0, step);
        scrollTotal += step;
        // 滚动到页面底部后停止
        if (scrollTotal >= fullHeight - window.innerHeight) {
          clearInterval(timer);
          resolve();
        }
      }, 200);
    });
  });

  await browser.close();
})();

方案2:页面级路由覆盖所有框架

如果你只需要拦截当前页面的所有请求(包括子框架),可以给page.route添加frame: '**'选项:

import { firefox } from 'playwright';

(async () => {
  const browser = await firefox.launch();
  const page = await browser.newPage();
  const domain = 'https://www.reddit.com/';

  // 拦截当前页面所有框架的请求
  await page.route('**', async route => {
    console.log(`拦截请求: ${route.request().url()}`);
    const response = await route.fetch();
    await route.fulfill({ response });
  }, { frame: '**' });

  await page.goto(domain);

  // 模拟滚动逻辑
  await page.evaluate(async () => {
    await new Promise(resolve => {
      let scrollTotal = 0;
      const step = 150;
      const timer = setInterval(() => {
        const fullHeight = document.body.scrollHeight;
        window.scrollBy(0, step);
        scrollTotal += step;
        if (scrollTotal >= fullHeight - window.innerHeight) {
          clearInterval(timer);
          resolve();
        }
      }, 200);
    });
  });

  await browser.close();
})();

关键说明

  • 全局路由(browser.route)适合需要监控整个浏览器所有流量的场景,比如多页面操作或包含大量子框架的应用。
  • 页面级带框架参数的路由(page.route+frame: '**')更轻量化,仅针对当前页面的所有框架请求。
  • 确保使用最新版Playwright,旧版本可能存在路由拦截的兼容性问题。

内容的提问来源于stack exchange,提问作者Andjelko Topic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:30:24