使用RequestHook覆盖浏览器语言

时间:2019-07-15 11:42:29

标签: javascript request automated-tests e2e-testing testcafe

我正在通过浏览器设置在支持多种语言的Web应用程序上编写测试。

我写了一个RequestHook覆盖了Accept-Language标头。但是,这似乎不起作用。该语言似乎总是在美国(我猜是从我的系统上来的吗?)

import { Selector } from 'testcafe';
class LanguageRequestHook extends RequestHook {
    constructor(language, requestFilterRules) {
        super(requestFilterRules, {
            includeHeaders: true,
            includeBody: true});
        this.language = language;
    }
    async onRequest(event) {
        event.requestOptions.headers['Accept-Language'] = this.language;
    }
    async onResponse(responseEvent) {
        //Nothing
    }
}

const dutchLanguageHook = new LanguageRequestHook('nl-NL');

fixture('hook test').page('https://www.wikipedia.org/').requestHooks(dutchLanguageHook);

test('test dutch wiki', async t => {
    await t.expect(Selector('.localized-slogan').innerText).eql('De vrije encyclopedie');
});

使用我的RequestHook,我希望请求能表明它希望使用荷兰维基百科页面,而不是英语版本。 RequestHook确实在调试器中被调用。

1 个答案:

答案 0 :(得分:1)

您的代码看起来正确。确保通过更改要测试的网站上的“ Accept-Language”标头来设置语言。 您提供的示例无效,因为Wikipedia网站不支持通过更改“ Accept-Language”标头设置的语言。 您可以通过运行以下脚本进行检查:

const rp      = require('request-promise');
const cheerio = require('cheerio');

const options = {
    url: 'https://www.wikipedia.org/',

    headers: {
        'Accept-Language': 'nl-NL'
    }
};

rp(options)
    .then(body => {
        return cheerio.load(body);
    })
    .then($ => {
        console.log($('.localized-slogan').text());
    })
    .catch(e => console.error(e));