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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:45:21