Условное тестирование в 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 повышает стабильность автоматизированных проверок и обеспечивает корректное выполнение сценариев в мультибраузерных окружениях. Такой подход позволяет адаптировать тесты под особенности конкретных браузеров без дублирования кода и потери читаемости.