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 互不影响。
参考资料
本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。