如何在 Puppeteer 中指定浏览器语言

问题描述 投票:0回答:4

我想使用 Puppeteer 启动具有西班牙语

es
语言的 Google Chrome 浏览器。

我已经尝试过

puppeteer.launch(args:['--lang=es',...],...)
但没有成功。

我尝试过传递环境变量

LANGUAGE=es mocha puppeteer-test.js
但没有成功。

我尝试使用

userDataDir
选项并传递带有
Preferences
文件的文件夹
{ "intl": { "accept_languages": "es" } }
但浏览器设置 - 语言仍然不显示西班牙语,
window.navigator.languages
也不显示
window.navigator.language

我正在使用
木偶师 0.11.0
节点8.4.0
NPM 5.2.0
macOS El Capitan 10.11.6
MacBook Pro Retina,15 英寸,2015 年中

javascript google-chrome google-chrome-headless puppeteer browser-testing
4个回答
69
投票

更改区域设置的方法有多种,您可以尝试所有方法来找到适合您的方法,

启动时使用参数

const browser = await puppeteer.launch({
    headless: false,
    args: ['--lang=bn-BD,bn']
});

将语言作为标题发送

await page.setExtraHTTPHeaders({
    'Accept-Language': 'bn'
});

强制设置语言

// Set the language forcefully on javascript
await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, "language", {
        get: function() {
            return "bn-BD";
        }
    });
    Object.defineProperty(navigator, "languages", {
        get: function() {
            return ["bn-BD", "bn"];
        }
    });
});

为了测试,我将用多种语言进行测试,包括

es
,这是结果。

谷歌搜索:

浏览器泄露:


8
投票

Md-Abu-Taher 的答案有错误。

navigator.language
的响应应返回字符串,而不是数组。在您自己的浏览器控制台中尝试一下。

代码片段应该是:

await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, "language", {
        get: function() {
            return "en-GB";
        }
    });
    Object.defineProperty(navigator, "languages", {
        get: function() {
            return ["en-GB", "en"];
        }
    });
});

2
投票

在 Chrome Linux 上,您可以这样做

puppeteer.launch({ ...yourParams, env: { LANGUAGE: "fr_FR" } })

我不知道其他操作系统/浏览器...


0
投票

已接受答案的附加信息:

如果您想通过 puppeteer 中的

navigator.language
属性动态更改语言环境,您需要将变量作为参数数组传递为
evaluateOnNewDocument()
函数的第二个参数,如下所示:

const locale = req.body.localization;

// add locale
await page.evaluateOnNewDocument((args) => {
    Object.defineProperty(navigator, "language", {
        get: function () {
            return args[0];
        }
    });
}, [locale]);

如果您想直接在

locale
函数中使用
evaluateOnNewDocument()
变量,它将是
undefined
并且 puppeteer 可能会渲染一个空页面。因此,您将需要这个带有参数的解决方法

© www.soinside.com 2019 - 2024. All rights reserved.