如何用Playwright(JavaScript)捕获新标签打开时的初始重定向URL
解决Playwright捕获新标签初始重定向URL的问题
要捕获新标签打开时的初始重定向URL(而非最终目标地址),核心是追踪新弹出页面的请求生命周期,而非直接取弹窗页面的最终URL。你的原方法失败是因为popup事件返回的页面对象已经完成重定向,request.url()只能拿到最终地址。
可行方案代码示例
const el = page.locator('div#clickable_element'); let initialPopupUrl; // 监听弹窗创建事件,拿到新页面实例后立即绑定请求监听 page.on('popup', async (popupPage) => { // 监听弹窗页面的所有请求,捕获重定向链 popupPage.on('request', (request) => { // 若当前请求是重定向而来,记录它的来源URL(即初始重定向地址) const redirectedFrom = request.redirectedFrom(); if (redirectedFrom) { initialPopupUrl = redirectedFrom.url(); } // 同时记录第一个发起的请求URL(防止无重定向的边界情况) if (!initialPopupUrl) { initialPopupUrl = request.url(); } }); // 等待页面加载完成,确保重定向流程结束 await popupPage.waitForLoadState(); }); await el.click(); // 短时间等待确保请求事件被捕获 await page.waitForTimeout(1000); const testUrl = 'https://www.example.com'; await expect(initialPopupUrl).toBe(testUrl);
另一种方式:遍历所有请求找初始重定向地址
如果需要更精准筛选,也可以在弹窗加载完成后遍历所有请求,找到被重定向的初始请求:
const el = page.locator('div#clickable_element'); let initialPopupUrl; page.on('popup', async (popupPage) => { await popupPage.waitForLoadState(); // 获取弹窗页面的所有请求记录 const allRequests = await popupPage.request.allRequests(); // 找到第一个触发重定向的请求(即有redirectedTo的请求) const initialRequest = allRequests.find(req => req.redirectedTo()); if (initialRequest) { initialPopupUrl = initialRequest.url(); } }); await el.click(); await page.waitForTimeout(1000); const testUrl = 'https://www.example.com'; await expect(initialPopupUrl).toBe(testUrl);
关键说明
- 必须在弹窗创建后立即监听其请求事件,才能捕获到完整的重定向流程
request.redirectedFrom():返回当前请求的来源请求(即重定向之前的请求实例)request.redirectedTo():返回当前请求重定向到的目标请求实例
内容的提问来源于stack exchange,提问作者DBencz
相关产品推荐
相关产品推荐

