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
相关产品推荐
相关产品推荐

