Playwright 如何获取当前页面 URL

page.url() 同步返回当前 URL 字符串(不用 await);断言导航用 await expect(page).toHaveURL(/pattern/) 自动等待。附提取参数与等待导航完成的技巧。

最佳实践
测试检测与质量验证插画

一句话回答:page.url()——它是同步方法,直接返回当前页面 URL 字符串,不用 await:const url = page.url()。测试里断言"跳转到了某页面"推荐 await expect(page).toHaveURL(/\/dashboard/),它会重试直到 URL 满足断言;这不代表页面业务数据已加载完成。

基本用法

const { test, expect } = require('@playwright/test');

test('登录后跳转', async ({ page }) => {
  await page.goto('https://example.com/login');
  // ...登录操作...
  console.log(page.url());            // 同步获取,打印当前 URL
});

断言 URL(推荐)

// 精确匹配
await expect(page).toHaveURL('https://example.com/dashboard');

// 正则匹配(更常用,忽略动态参数)
await expect(page).toHaveURL(/\/dashboard/);

// 动态路径用正则;字符串参数不是 glob
await expect(page).toHaveURL(/\/user\/[^/]+\/profile(?:[?#].*)?$/);

page.url() 是"此刻快照",导航未完成时拿到的是旧 URL;toHaveURL 会重试等待——跳转后的断言一律用后者。

解析 URL 参数

const url = new URL(page.url());
console.log(url.pathname);                    // /dashboard
console.log(url.searchParams.get('tab'));     // ?tab=settings → settings

等待导航完成再取值

// 点击触发跳转的场景
await page.getByRole('link', { name: '文档' }).click();
await page.waitForURL(/\/docs/);     // 等 URL 变成目标模式
console.log(page.url());              // 此时拿才是新地址

常见问题(FAQ)

Q:iframe 里的页面 URL 怎么拿?

A:page.url() 是主框架的。iframe 先 const frame = page.frameLocator('#iframe-id') 定位操作;要 iframe 的 URL 用 page.frames() 找到对应 frame 后 frame.url()。

Q:hash 路由(SPA 的 #/path)能匹配吗?

A:能。hash 是 URL 的一部分:toHaveURL(/#\/users/)。SPA 路由变化不会触发完整导航,waitForURL 对 hash 变化同样有效。

Q:多标签页场景怎么区分?

A:监听 context.on('page') 或 page.waitForEvent('popup') 拿到新 Page 对象,各自调用 .url()。不同 Page 的 URL 互不影响。


参考资料

本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台