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

Puppeteer检测新标签页链接响应200状态时遇导航超时求助

解决Puppeteer检测新标签页链接重定向状态的超时问题

我太懂你这个困扰了!你原来的代码只适用于在当前页面跳转的链接,而带target="_blank"的新标签页链接点击后,当前页面根本不会触发导航事件——这就是为什么page.waitForNavigation()一直等不到结果,最后超时报错的原因!

问题根源

当你点击带新标签页的链接时,浏览器会创建一个全新的页面上下文(新标签/窗口),而你原来的代码在死死盯着当前页面的导航变化,完全找错了对象,超时自然是必然的。

修正后的代码方案

我们需要换个思路:监听新标签页的创建事件,而不是等待当前页面的导航。下面是调整后的代码:

await page.goto('http://www.endocrinologynetwork.com/', { waitUntil: "load" });
await page.waitForSelector('.l-footer.wrap');

// 同时执行两个操作:监听新标签页创建 + 点击目标链接
const [newTarget] = await Promise.all([
  // 捕获与当前页面URL不同的新目标(即新标签页)
  page.waitForTarget(target => target.url() !== page.url()),
  page.$$eval("a", as => as.find(a => a.innerText.includes("Advertiser Terms")).click())
]);

// 获取新标签页的页面实例
const newPage = await newTarget.page();
// 等待新页面加载完成
await newPage.waitForNavigation({ waitUntil: 'load' });

// 获取新页面的响应状态
const response = await newPage.goto(newPage.url());
// 验证状态码
expect(response.status()).toBe(200);

// 记得关闭新页面,避免资源占用
await newPage.close();

额外注意事项

  • 如果你的链接带有rel="noopener noreferrer"属性,不用担心,Puppeteer依然可以正常捕获新标签页的目标。
  • 可以给page.waitForTarget添加超时参数,比如{ timeout: 15000 }(15秒),避免因网络慢导致的意外超时。
  • 如果你需要更精准地捕获特定链接的新标签页,可以把target.url() !== page.url()改成更具体的判断,比如target.url().includes('advertiser-terms')(根据实际跳转URL调整)。

这样修改后,就能正常检测新标签页链接的重定向状态啦,和检测当前页面跳转的链接一样顺畅~

内容的提问来源于stack exchange,提问作者Maksim Koshelenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:53:53