如何使用 Puppeteer 监听历史记录?

2023-11-29

使用Puppeteer,是否可以监听浏览器历史记录API,例如history.pushState, history.replaceState or history.popState,通常由单页应用程序框架路由器在幕后使用,例如react-router,通过视图向后和第四导航?
我不是在寻找page.waitForNavigation(options),因为它并不是真正意义上的导航,也不是听众。
此外,我希望能够捕获传递给历史函数的参数,例如data, title and url.


您可以使用waitForNavigation监听 History API 事件。例子:

const browser = await puppeteer.launch();
const page = await browser.newPage();

await page.goto('https://www.google.com');

const [navResponse] = await Promise.all([
    page.waitForNavigation(),
    page.evaluate(() => { history.pushState(null, null, 'imghp') }),
])

console.log(navResponse) // null as per puppeteer docs
await browser.close();

根据文档,导航响应为空。 “如果由于历史 API 使用而导航到不同的锚点或导航,则导航将解析为 null。”

如果您使用散列导航,则可以创建一个事件侦听器,以便在路由按照指定的方式更改时创建事件侦听器。傀儡师示例.

  await page.exposeFunction('onHashChange', url => page.emit('hashchange', url));
  await page.evaluateOnNewDocument(() => {
    addEventListener('hashchange', e => onHashChange(location.href));
  });

  // Listen for hashchange events in node Puppeteer code.
  page.on('hashchange', url => console.log('hashchange event:', new URL(url).hash));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Puppeteer 监听历史记录? 的相关文章

随机推荐

  • 列表视图顶部出现奇怪的黑线

    我正在创建一个布局ListView在列表的最顶部有一条奇怪的黑线 我似乎不知道如何摆脱它 它是的一部分ListView因为它会随着我调整大小而上下移动ListView 以前有人遇到过这个吗 由于某种原因 我无法让 DDMS 进行屏幕截图 所
  • 将旧域重定向到新域 - Rewriterule

    以下是我的 htaccess 文件中的重定向规则 他们重定向https olddomain com to https subdomain domain com但网页没有被重定向 我仍然在加载 olddomain com page1 Rewr
  • 将数据从 Flash 发送到 Starling 类

    我想将数据从 mainClass Flash 类 发送到我的 Starling 类 这是两个类的代码 我需要在它们之间传递数据 package import flash display Sprite import flash events
  • 如何通过 Jasper PHP/REST API 部署报告(jrxml 文件)?

    如何部署报告 jrxml文件 通过 Jasper PHP REST API 到 Jasper 报表服务器 要使用 Rest API 在 Jasper Server 上部署 Jasper 报告 您可以使用以下方法 上传 JRXML 文件 JR
  • 如何使用正则表达式和Powershell提取字符串“Task(12345)”中的数字?

    如何使用正则表达式和Powershell提取字符串 Task 12345 中的数字 我尝试了以下方法 但没有机会 file gc myfile txt matches regex Task d 1 5 matches file Get a
  • Android 谷歌驱动器文件更改侦听器不起作用

    我已将更改侦听器注册到谷歌驱动器文件 如下所示 DriveFile driveFile Drive DriveApi getFile mGoogleApiClient mSelectedFileId driveFile addChangeL
  • 将秒转换为 HH:MM:SS [重复]

    这个问题在这里已经有答案了 我在网上找到了一个将秒转换为HH MM SS的函数 函数是这样的 function sec2hms sec padHours false hms hours intval intval sec 3600 hms
  • Codeigniter:标头已发送错误[重复]

    这个问题在这里已经有答案了 我有一个 CI 应用程序 它具有身份验证控制器和切换用户功能 基本上它所做的就是从 URI 中获取 ID 从 ID 中获取一些用户数据 分配一些会话数据 然后加载视图 function switch user i
  • 整个项目的行尾更改编辑器/应用程序

    我有一个由许多扩展组成的项目 这些扩展使用全部 3 种行结束类型 但服务器只能运行2个 我有一个编辑器可以更改打开文件中的行结尾 但我需要一些可以进行批量转换的应用程序 因为它大约有 10 000 个文件 有任何想法吗 谢谢你 例如 可以使
  • 无法理解如何在 1.6+ 中使用不同密度的图像?

    我试图了解 res drawables 图像如何在不同的屏幕密度下工作 现在我有一个 1 5 的应用程序 例如 我有一个 100x100 像素的图像 当在 Droid 上使用时 它会缩放该图像 使其在该设备上看起来具有相同的大小 所有其他布
  • Phonegap 应用程序:外部 URL 无法在 IOS 的应用内浏览器中打开

    外部 URL 无法在我的 PhoneGap IOS 应用程序的系统浏览器中打开 我正在使用 PhoneGap Build 2 7 0 JavaScript window open myURL blank location yes 配置文件
  • 使用 WHERE ... IN (...) 进行慢速 SQL 查询的替代方法

    这实际上是一个更大的复杂查询的一部分 根据查询计划 此语句的排序主导较大查询的成本 通过具体化查询的这一部分 我验证了它在成本中占主导地位 select sID ROW NUMBER over partition by sID order
  • 奇怪的 java 行为与原始类型的转换

    可能有人在某个地方问过这个问题 但我找不到它 有人可以澄清为什么这段代码会编译并打印出来吗1 long i byte char int long 1 System out println i 它被解析为 long i byte char i
  • Java 8 Stream 与批处理

    我有一个包含项目列表的大文件 我想创建一批项目 并使用该批次发出 HTTP 请求 所有项目都需要作为 HTTP 请求中的参数 我可以很容易地做到这一点for循环 但作为 Java 8 爱好者 我想尝试使用 Java 8 的 Stream 框
  • 与儿童一起使用 CCSprite 淡出

    我正在使用一个CCSprite和其他一些人CCSprite作为子对象添加的对象 我使用的其他动画 缩放和旋转 效果很好 并且子对象也有动画 但是当我使用时CCFadeOut 它只会淡化父级 我读到淡出不适用于儿童 除了迭代每个孩子并调用每个
  • 如何在asp.net中的preinit函数中访问Session?

    void Page PreInit Object sender EventArgs e HttpCookie userInfo userInfo Request Cookies userInfo Session EmpID userInfo
  • TPU本地文件系统不存在?

    我写了一个神经网络模型来分析图像并在最后提取 8 个浮点数 该模型在我的计算机上运行良好 但速度缓慢 因此我在 TPU 云上尝试它 然后砰 我有一个错误 I1008 12 58 47 077905 140221679261440 tf lo
  • Python 中带有两个条件的 if 语句

    我正在编写一个简单的控制台程序来帮助我自己和一些地质学同学进行岩石样本分析 我们的讲师为我们提供了一个流程图 有助于指定样本的特征 我正在尝试将其制作成控制台程序 我的问题是第 9 行的 if 语句是否可以接受两个条件 如果可以的话我写得正
  • 在 Angular 中渲染模板之前加载数据

    我在用角6并使用单向绑定 我在组件中的代码如下所示 ngOnInit this profile getUser 1 subscribe data gt this userData this compiler constructUserDat
  • 如何使用 Puppeteer 监听历史记录?

    使用Puppeteer 是否可以监听浏览器历史记录API 例如history pushState history replaceState or history popState 通常由单页应用程序框架路由器在幕后使用 例如react ro