Работа с авторизацией

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

1. Использование форм авторизации

Самый распространённый способ авторизации — это использование стандартной формы входа на сайт. Для взаимодействия с элементами формы (поля для ввода логина и пароля, кнопка отправки) WebDriverIO предоставляет простые и удобные методы.

Пример авторизации через форму:

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

        // Заполнение поля логина
        const usernameField = await $('#username');
        await usernameField.setValue('testuser');

        // Заполнение поля пароля
        const passwordField = await $('#password');
        await passwordField.setValue('password123');

        // Нажатие на кнопку входа
        const loginButton = await $('button[type="submit"]');
        await loginButton.click();

        // Проверка успешной авторизации
        const welcomeMessage = await $('#welcome-message');
        await expect(welcomeMessage).toHaveTextContaining('Добро пожаловать');
    });
});

В этом примере используется стандартная форма с полями для ввода логина и пароля, а также кнопка для отправки формы. WebDriverIO предоставляет доступ к элементам через селекторы, такие как #username и #password. Для симуляции ввода значений в поля применяется метод setValue(), а для клика по кнопке — click().

2. Авторизация через API

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

Пример авторизации через API:

import axios from 'axios';

describe('API авторизация', () => {
    it('Пользователь авторизуется через API', async () => {
        const response = await axios.post('https://example.com/api/login', {
            username: 'testuser',
            password: 'password123',
        });

        expect(response.status).toBe(200);
        expect(response.data.token).toBeDefined();
    });
});

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

3. Авторизация с использованием cookies

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

Пример установки cookies для авторизации:

describe('Авторизация через cookies', () => {
    it('Пользователь авторизуется с помощью cookies', async () => {
        // Открытие страницы
        await browser.url('https://example.com');

        // Установка cookies
        await browser.setCookies({
            name: 'auth_token',
            value: 'sampleAuthToken',
            domain: 'example.com',
        });

        // Перезагрузка страницы
        await browser.refresh();

        // Проверка успешной авторизации
        const userAvatar = await $('#user-avatar');
        await expect(userAvatar).toBeDisplayed();
    });
});

В данном примере используется метод setCookies(), который позволяет установить cookie, имитируя состояние авторизации. Это решение удобно, когда нужно сразу получить доступ к авторизованному пользователю, минуя процесс входа.

4. Авторизация с использованием SSO (Single Sign-On)

Системы SSO предоставляют возможность входа в несколько приложений с использованием единой учетной записи. В тестах для работы с такими системами нужно учитывать специфическую логику, которая может включать редиректы и дополнительные шаги аутентификации.

Для работы с SSO можно использовать WebDriverIO для автоматизации всех шагов входа, включая ввод данных на странице логина и переходы по редиректам.

Пример авторизации через SSO:

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

        // Перенаправление на страницу SSO
        const ssoButton = await $('button.sso');
        await ssoButton.click();

        // Ввод данных на странице SSO
        const ssoUsername = await $('#sso-username');
        await ssoUsername.setValue('testuser');

        const ssoPassword = await $('#sso-password');
        await ssoPassword.setValue('password123');

        const ssoLoginButton = await $('#sso-login');
        await ssoLoginButton.click();

        // Проверка успешной авторизации
        const userProfile = await $('#user-profile');
        await expect(userProfile).toBeDisplayed();
    });
});

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

5. Сохранение состояния авторизации для последующих тестов

Чтобы избежать повторной авторизации при каждом запуске тестов, можно использовать сохранение состояния авторизации. В WebDriverIO можно сохранять cookies или токены авторизации и использовать их в следующих тестах.

Пример сохранения и использования cookies:

describe('Сохранение состояния авторизации', () => {
    it('Сохранение cookies после авторизации', async () => {
        // Открытие страницы авторизации
        await browser.url('https://example.com/login');

        // Ввод данных и авторизация
        const usernameField = await $('#username');
        await usernameField.setValue('testuser');
        const passwordField = await $('#password');
        await passwordField.setValue('password123');
        const loginButton = await $('button[type="submit"]');
        await loginButton.click();

        // Сохранение cookies
        const cookies = await browser.getCookies();
        // Сохранение cookies в файл или переменную для использования в следующем тесте
        // Например, cookies могут быть записаны в файл, который позже будет загружен

        // Завершаем тест
        await browser.url('https://example.com/dashboard');
        const dashboardTitle = await $('#dashboard-title');
        await expect(dashboardTitle).toHaveTextContaining('Добро пожаловать');
    });
});

В этом примере сохраняются cookies после успешной авторизации, что позволяет в последующих тестах использовать их для имитации авторизованного состояния, избегая повторной авторизации.

6. Использование WebDriverIO с интеграцией в CI/CD

При работе с WebDriverIO в CI/CD пайплайне важно обеспечить стабильность процесса авторизации. В таких системах часто используются переменные окружения для хранения учетных данных, что позволяет избежать жестко закодированных значений в тестах.

Пример использования переменных окружения:

describe('Авторизация с использованием переменных окружения', () => {
    it('Пользователь может войти с использованием переменных окружения', async () => {
        const username = process.env.USERNAME;
        const password = process.env.PASSWORD;

        await browser.url('https://example.com/login');

        const usernameField = await $('#username');
        await usernameField.setValue(username);

        const passwordField = await $('#password');
        await passwordField.setValue(password);

        const loginButton = await $('button[type="submit"]');
        await loginButton.click();

        const userAvatar = await $('#user-avatar');
        await expect(userAvatar).toBeDisplayed();
    });
});

Этот подход позволяет безопасно и гибко работать с данными для авторизации, особенно в условиях автоматизированных тестов в CI/CD.