Смена языка в тестах

Для выполнения автоматических тестов на веб-приложениях, которые поддерживают несколько языков интерфейса, необходимо настроить смену языка на нужный в процессе тестирования. В WebdriverIO это можно сделать несколькими способами, в зависимости от особенностей проекта, структуры тестов и используемых библиотек.

Основные подходы к смене языка

Смена языка в тестах может быть реализована несколькими способами:

  1. Изменение языка через интерфейс (например, через меню выбора языка)
  2. Изменение языка через настройки сессии или локализации на уровне браузера
  3. Параметризация языка через URL

Каждый из этих методов имеет свои особенности и может быть использован в зависимости от типа веб-приложения.

Изменение языка через интерфейс

Многие веб-приложения предоставляют пользователю возможность смены языка через меню выбора языка. Чтобы автоматизировать такой процесс в WebdriverIO, необходимо взаимодействовать с элементами UI, которые отвечают за смену языка.

Пример использования WebdriverIO для смены языка через меню:

describe('Смена языка через интерфейс', () => {
    it('должен изменить язык на французский', async () => {
        // Открыть сайт
        await browser.url('https://example.com');

        // Найти элемент меню выбора языка
        const languageMenu = await $('button.language-menu');
        await languageMenu.click();

        // Выбрать язык
        const frenchOption = await $('li[data-language="fr"]');
        await frenchOption.click();

        // Подтвердить, что язык изменился
        const pageTitle = await $('h1');
        expect(await pageTitle.getText()).toBe('Bienvenue');
    });
});

В этом примере сначала открывается веб-страница, затем ищется кнопка меню выбора языка, после чего выбирается французский язык. В конце проверяется, что текст на странице изменился на французский, что подтверждает смену языка.

Этот способ удобен в случае, если в приложении есть интерфейсный элемент для выбора языка, и его можно легко автоматизировать.

Изменение языка через настройки браузера

В случае, если приложение использует автоматическую локализацию на основе настроек браузера, можно изменить язык браузера для симуляции работы с веб-приложением на нужном языке.

Для этого можно использовать WebdriverIO с библиотекой @wdio/browserstack-service или напрямую работать с возможностями браузера.

Пример настройки языка в браузере с использованием WebdriverIO:

describe('Смена языка через настройки браузера', () => {
    it('должен открыть сайт с английским языком', async () => {
        // Запуск браузера с параметрами для английского языка
        const options = {
            capabilities: {
                browserName: 'chrome',
                'goog:chromeOptions': {
                    args: ['--lang=en']
                }
            }
        };
        await browser.url('https://example.com');
        const pageTitle = await $('h1');
        expect(await pageTitle.getText()).toBe('Welcome');
    });

    it('должен открыть сайт с французским языком', async () => {
        // Запуск браузера с параметрами для французского языка
        const options = {
            capabilities: {
                browserName: 'chrome',
                'goog:chromeOptions': {
                    args: ['--lang=fr']
                }
            }
        };
        await browser.url('https://example.com');
        const pageTitle = await $('h1');
        expect(await pageTitle.getText()).toBe('Bienvenue');
    });
});

В этом примере используется аргумент --lang для указания языка браузера. Важно, чтобы приложение поддерживало автодетекцию языка браузера, иначе этот метод может не сработать.

Изменение языка через URL

Некоторые веб-приложения используют языковой параметр в URL для выбора языка интерфейса. Например, URL может быть вида https://example.com/?lang=en или https://example.com/fr.

Пример использования WebdriverIO для смены языка через URL:

describe('Смена языка через URL', () => {
    it('должен открыть сайт на французском языке', async () => {
        // Открыть страницу с параметром языка в URL
        await browser.url('https://example.com?lang=fr');
        
        const pageTitle = await $('h1');
        expect(await pageTitle.getText()).toBe('Bienvenue');
    });

    it('должен открыть сайт на английском языке', async () => {
        // Открыть страницу с параметром языка в URL
        await browser.url('https://example.com?lang=en');
        
        const pageTitle = await $('h1');
        expect(await pageTitle.getText()).toBe('Welcome');
    });
});

Этот способ используется в том случае, если приложение позволяет менять язык через параметры URL. Это может быть полезно, если необходимо быстро переключаться между языками без взаимодействия с интерфейсными элементами.

Использование глобальных настроек для смены языка

Если приложение поддерживает многоязычность на уровне настроек сессии, можно устанавливать язык через глобальные переменные или API. Например, при тестировании можно задать переменную с нужным языком, и приложение будет автоматически подстраиваться под нее.

Пример использования глобальных настроек для смены языка:

describe('Смена языка через глобальные настройки', () => {
    it('должен использовать французский язык', async () => {
        // Установить глобальную переменную с языковыми настройками
        browser.execute(() => {
            window.localStorage.setItem('language', 'fr');
        });

        await browser.url('https://example.com');
        const pageTitle = await $('h1');
        expect(await pageTitle.getText()).toBe('Bienvenue');
    });

    it('должен использовать английский язык', async () => {
        // Установить глобальную переменную с языковыми настройками
        browser.execute(() => {
            window.localStorage.setItem('language', 'en');
        });

        await browser.url('https://example.com');
        const pageTitle = await $('h1');
        expect(await pageTitle.getText()).toBe('Welcome');
    });
});

В данном примере используется localStorage для сохранения и изменения языка, что позволяет не только тестировать смену языка, но и автоматизировать процесс для конкретной сессии.

Вывод

В тестировании WebdriverIO смена языка может быть реализована разными способами в зависимости от структуры веб-приложения. Использование интерфейсных элементов, настроек браузера, параметров URL или глобальных переменных — все эти методы помогают эффективно работать с многоязычными интерфейсами в автоматизированных тестах. Выбор конкретного метода зависит от требований тестируемого приложения и того, как реализована локализация на стороне сервера и клиента.