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

Playwright中RunAndWaitForPageAsync/WaitForURLAsync与Chrome完整URL设置问题

问题

我用Playwright的C#代码做测试时遇到个问题:下面两段代码只有在Chrome开启「始终显示完整网址」选项时才能正常工作,但每次运行测试这个设置都会被自动关掉,得手动重新打开。Java版本的测试也有同样的问题。

代码片段:

await page.WaitForURLAsync(url, new PageWaitForURLOptions { Timeout = 5000 });

或者

IPage myNewBrowserTab = await _context.RunAndWaitForPageAsync(async () =>
{
    //点击“Launch”并设置myNewBrowserTab
    await page.GetByTestId("pw-Launch3rdPartyApp-launch-btn-2").GetByText("LAUNCH").ClickAsync();
});

想请教两个方向的解决办法:要么让测试自动开启Chrome的「始终显示完整网址」设置,要么让代码不用依赖这个设置,能正常处理不带https://的URL。

解决方案

办法一:启动Chrome时强制开启完整URL显示

Playwright支持给Chrome加启动参数或者预设偏好设置,直接在代码里配置就行,不用手动改浏览器设置:

C# 代码示例

用启动参数的方式

var launchOptions = new BrowserTypeLaunchOptions
{
    Args = new[] { "--force-show-full-url" }
};
await using var browser = await playwright.Chromium.LaunchAsync(launchOptions);

用偏好设置的方式

var contextOptions = new BrowserContextOptions();
// 给Chrome设置强制显示完整URL的偏好
contextOptions.SetChromiumOption("prefs", new Dictionary<string, object>
{
    ["browser.urlbar.force_show_full_url"] = true
});
await using var context = await browser.NewContextAsync(contextOptions);

Java 代码示例

启动参数方式

Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions()
  .setArgs(Arrays.asList("--force-show-full-url")));

偏好设置方式

BrowserContext context = browser.newContext(new Browser.NewContextOptions()
  .setChromiumOption("prefs", Map.of(
    "browser.urlbar.force_show_full_url", true
  )));

办法二:修改代码适配不带协议的URL

如果不想依赖浏览器设置,直接调整代码逻辑,让它能识别不带https://的URL:

针对WaitForURLAsync

有几种方式可以适配:

  • 用相对路径(前提是当前页面的域名和目标页面一致):
await page.WaitForURLAsync("/target-path", new PageWaitForURLOptions { Timeout = 5000 });
  • 手动补全协议拼出完整URL:
string fullUrl = $"https://{url}"; // 这里假设url是域名加路径的格式
await page.WaitForURLAsync(fullUrl, new PageWaitForURLOptions { Timeout = 5000 });
  • 用正则表达式匹配,兼容带/不带协议的情况:
await page.WaitForURLAsync(new Regex(url), new PageWaitForURLOptions { Timeout = 5000 });

针对RunAndWaitForPageAsync

拿到新标签页后,直接检查URL里的核心部分(比如域名加路径),不用纠结有没有协议:

IPage myNewBrowserTab = await _context.RunAndWaitForPageAsync(async () =>
{
    await page.GetByTestId("pw-Launch3rdPartyApp-launch-btn-2").GetByText("LAUNCH").ClickAsync();
});

// 检查URL是否包含预期的主机和路径
string expectedPart = "example.com/target-page";
if (myNewBrowserTab.Url.Contains(expectedPart))
{
    // 继续后续测试逻辑
}
// 或者用正则同时匹配http和https的情况
if (Regex.IsMatch(myNewBrowserTab.Url, $"https?://{expectedPart}"))
{
    // 继续后续测试逻辑
}

内容的提问来源于stack exchange,提问作者Ewan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:45:02