Условное тестирование по браузеру

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

Определение браузера

Protractor использует WebDriver и объект browser, который предоставляет доступ к сессии браузера. Для условной логики важны следующие свойства:

const capabilities = browser.getCapabilities();
capabilities.then(function(caps) {
    console.log(caps.get('browserName')); // например, 'chrome' или 'firefox'
    console.log(caps.get('version'));     // версия браузера
});

Метод getCapabilities() возвращает объект Capabilities, содержащий информацию о браузере, платформе и других параметрах. Этот объект можно использовать для построения условных конструкций.

Применение условной логики

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

it('должен работать корректно в разных браузерах', async () => {
    const caps = await browser.getCapabilities();
    const browserName = caps.get('browserName');

    if (browserName === 'chrome') {
        await element(by.id('buttonChrome')).click();
    } else if (browserName === 'firefox') {
        await element(by.id('buttonFirefox')).click();
    }
});

Пропуск тестов по браузеру

Для полностью несовместимых функций иногда требуется пропускать тесты:

const caps = await browser.getCapabilities();
const browserName = caps.get('browserName');

if (browserName === 'internet explorer') {
    pending('Тест не поддерживается в IE');
}

pending() помечает тест как временно пропущенный без генерации ошибки.

Условные ожидания

Некоторые действия могут требовать разной стратегии ожидания элементов в зависимости от браузера. В Protractor используется ExpectedConditions:

const EC = protractor.ExpectedConditions;
const caps = await browser.getCapabilities();
const browserName = caps.get('browserName');

const el = element(by.id('dynamicElement'));

if (browserName === 'firefox') {
    await browser.wait(EC.visibilityOf(el), 5000);
} else {
    await browser.wait(EC.presenceOf(el), 5000);
}

Разные браузеры могут по-разному обрабатывать рендеринг элементов, поэтому использование условных ожиданий повышает стабильность тестов.

Конфигурация и фильтрация

Protractor позволяет использовать параметры в конфигурации для выборочной активации тестов по браузеру:

exports.config = {
    multiCapabilities: [
        { browserName: 'chrome' },
        { browserName: 'firefox' }
    ]
};

Используя параметры и getCapabilities(), можно динамически определять, какие блоки тестов запускать:

describe('Функциональные тесты', () => {
    beforeEach(async () => {
        const caps = await browser.getCapabilities();
        if (caps.get('browserName') === 'firefox') {
            pending('В Firefox тест не выполняется');
        }
    });

    it('проверка кнопки', async () => {
        await element(by.id('mainButton')).click();
    });
});

Условные селекторы и действия

Иногда элементы на странице различаются визуально или по DOM в зависимости от браузера. Для этого удобно создавать условные селекторы:

async function getLoginButton() {
    const caps = await browser.getCapabilities();
    if (caps.get('browserName') === 'chrome') {
        return element(by.css('.chrome-login'));
    } else {
        return element(by.css('.other-login'));
    }
}

it('клик по кнопке логина', async () => {
    const loginBtn = await getLoginButton();
    await loginBtn.click();
});

Это снижает дублирование кода и делает тесты более читаемыми при поддержке нескольких браузеров.

Практические рекомендации

  • Минимизировать условные конструкции: использовать их только там, где действительно существует различие в поведении браузеров.
  • Использовать функции-обёртки для селекторов и действий: упрощает поддержку и масштабирование тестов.
  • Объединять проверки в beforeEach или beforeAll: позволяет централизованно управлять условной логикой.
  • Использовать pending() для неполной поддержки: это лучше, чем получать ошибку в неподдерживаемом браузере.
  • Проверять версии браузеров: иногда различия проявляются только в старых версиях, поэтому полезно включать версионную проверку.

Условное тестирование по браузеру в Protractor повышает стабильность автоматизированных проверок и обеспечивает корректное выполнение сценариев в мультибраузерных окружениях. Такой подход позволяет адаптировать тесты под особенности конкретных браузеров без дублирования кода и потери читаемости.