使用Playwright设置浏览器语言及验证网站语言的问题
问题:Playwright中永久修改浏览器语言并验证网站语言匹配
我需要编写Playwright测试,验证网站显示语言是否与浏览器设置匹配。该网站会选取Chrome语言设置数组中的第一个语言,且页面头部无当前语言标识。
遇到的核心问题
- 使用
var language = await page.EvaluateAsync<string[]>("() => navigator.languages");获取浏览器语言数组时,仅返回"de-DE",无法拿到完整的语言数组 - 无法永久将Playwright浏览器语言设置为英文:修改
navigator.language后刷新页面会恢复为德语,网站内容也始终未切换为"en-US";设置Locale="en-US"、配置美国地理定位均无效 - 手动修改浏览器语言设置可正常影响网站显示,因此核心需求是找到Playwright中永久修改浏览器语言的有效方法
我的测试代码
using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Playwright; using System.Net.Http.Headers; namespace BlazorServerTest.dplaywright.test; public class LanguageTest { // 检查浏览器语言,并验证页面显示文本是否匹配对应语言 [Fact] public async Task Test() { // 初始化Playwright using var playwright = await Playwright.CreateAsync(); // 启动浏览器 await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = false, }); // 创建上下文,配置语言、定位等参数 var context = await browser.NewContextAsync(new BrowserNewContextOptions { Permissions = new[] { "geolocation" }, Locale = "en-US", ExtraHTTPHeaders = new Dictionary<string, string> { ["Accept-Language"] = "en-US,en;q=0.9" }, Geolocation = new Geolocation { Longitude = -95.712891f, Latitude = 37.09024f, Accuracy = 100, }, }); // 创建页面并访问目标站点 var page = await browser.NewPageAsync(); await page.GotoAsync(url: "https://localhost/"); // 获取当前浏览器语言 var language = await page.EvaluateAsync<string>("() => navigator.language"); // 尝试修改navigator语言(仅当前会话有效,刷新后失效) await page.EvaluateAsync($@" () => {{ var newLang = {{language: 'en-US'}}; Object.defineProperty(navigator, 'language', {{ value: newLang.language, configurable: true }}); Object.defineProperty(navigator, 'languages', {{ get: () => [newLang.language], configurable: true }}); }} "); var language2 = await page.EvaluateAsync<string>("() => navigator.language"); // 刷新页面后,语言恢复为德语 await page.ReloadAsync(); var language3 = await page.EvaluateAsync<string>("() => navigator.language"); // 验证页面显示的是德语还是英文文本 var isExistGer = await page.Locator("text='Übersicht fehlerhafte VPD-Druckaufträge'").IsVisibleAsync(); var isExistEng = await page.Locator("text='Failed VPD print jobs overview'").IsVisibleAsync(); } }
已尝试的无效方案
// 修改html标签lang属性 await page.EvaluateAsync("document.documentElement.setAttribute('lang', 'en-US')"); // 单独设置页面的Accept-Language头 await page.SetExtraHTTPHeadersAsync(new Dictionary<string, string> { { "Accept-Language", "en-US" } }); // 再次尝试修改html标签lang属性 await page.EvaluateAsync(@$"() => {{ const html = document.documentElement; html.lang = 'en'; html.setAttribute('lang', 'en-US'); }}"); // 用HttpClient单独请求验证Accept-Language头的作用 var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://localhost/"); request.Headers.Remove("Accept-Language"); request.Headers.Add("Accept-Language", "de"); var response = await client.SendAsync(request); Console.WriteLine("response: " + response.StatusCode); var request1 = new HttpRequestMessage(HttpMethod.Get, "https://localhost/"); request1.Headers.Remove("Accept-Language"); request1.Headers.Add("Accept-Language", "en"); var response1 = await client.SendAsync(request1); Console.WriteLine("response2: " + response1.StatusCode);
内容的提问来源于stack exchange,提问作者Hans Sama
相关产品推荐
相关产品推荐

