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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:45:09