Protractor — инструмент для end-to-end тестирования Angular и не только Angular приложений, поддерживающий работу с браузерами через WebDriver. Для мобильных версий сайтов ключевым аспектом является имитация поведения мобильного устройства и корректная проверка адаптивного интерфейса.
Для эмуляции мобильного устройства в Protractor используется
конфигурация браузера через опции chromeOptions. Основные
параметры:
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['--window-size=375,667'], // размеры экрана iPhone 6/7/8
mobileEmulation: {
deviceName: 'iPhone X'
}
}
}
Примечания:
--window-size задаёт размеры окна браузера, что важно
для тестов без использования встроенной эмуляции.mobileEmulation.deviceName позволяет использовать
предустановленные настройки устройств, включая размеры экрана, плотность
пикселей и user-agent.Для мобильной версии сайта важна проверка расположения элементов, видимости и корректного масштабирования. В Protractor это выполняется через методы:
element(by.css('.menu')).isDisplayed().then(function(visible) {
expect(visible).toBe(true);
});
element(by.css('.header')).getCssValue('font-size').then(function(size) {
expect(size).toBe('16px');
});
Особенности:
getLocation() и getSize() позволяют
сравнивать позиции и размеры блоков для разных разрешений.Мобильные устройства используют жесты: свайпы, долгие нажатия и
касания. Protractor поддерживает эмуляцию этих действий через
browser.actions():
let menu = element(by.css('.slider'));
browser.actions().dragAndDrop(menu, {x: -200, y: 0}).perform();
browser.actions().mouseDown(element(by.css('.button'))).mouseUp().perform();
Важно:
dragAndDrop позволяет имитировать горизонтальный или
вертикальный свайп.mouseDown и mouseUp могут использоваться
для эмуляции долгого нажатия, хотя точная имитация multi-touch
ограничена стандартными возможностями WebDriver.Protractor поддерживает динамическое изменение размеров окна, что позволяет тестировать сайт на нескольких разрешениях в одном тесте:
browser.driver.manage().window().setSize(320, 568); // iPhone SE
browser.get('https://example.com');
expect(element(by.css('.menu')).isDisplayed()).toBe(true);
browser.driver.manage().window().setSize(414, 896); // iPhone 11 Pro Max
expect(element(by.css('.menu')).isDisplayed()).toBe(true);
Рекомендации:
Мобильные версии часто скрывают или показывают элементы через CSS
media queries. Для проверки таких изменений применяется метод
isDisplayed() и проверка CSS-свойств:
element(by.css('.mobile-menu')).isDisplayed().then(function(visible) {
expect(visible).toBe(true); // должен отображаться только на малых экранах
});
Дополнительно можно проверять свойства display и
visibility:
element(by.css('.desktop-menu')).getCssValue('display').then(function(value) {
expect(value).toBe('none'); // скрыт на мобильной версии
});
Мобильная версия часто подгружает данные динамически. В Protractor
можно использовать ожидания (ExpectedConditions) для
корректного тестирования:
let EC = protractor.ExpectedConditions;
let menu = element(by.css('.menu'));
browser.wait(EC.visibilityOf(menu), 5000);
expect(menu.isDisplayed()).toBe(true);
Особенности:
ExpectedConditions помогает избежать
нестабильных тестов из-за задержек загрузки контента.Для мобильных версий важно учитывать скорость загрузки и рендеринга элементов:
browser.executeScript позволяет измерять
время рендеринга:browser.executeScript("return window.performance.timing.loadEventEnd - window.performance.timing.navigationStart;")
.then(function(loadTime) {
expect(loadTime).toBeLessThan(3000);
});
browser.driver.sendChromiumCommand('Network.emulateNetworkConditions', {
offline: false,
latency: 200,
downloadThroughput: 500 * 1024,
uploadThroughput: 500 * 1024
});
Адаптивные версии часто меняют структуру DOM или скрывают части элементов. Рекомендуется использовать локаторы по CSS-классам и атрибутам, а не по фиксированным позициям. Примеры:
element(by.css('[data-test="mobile-login-button"]')).click();
element(by.xpath('//div[contains(@class, "slider-item")]')).getText();
Использование data-test атрибутов обеспечивает
стабильность тестов при изменении верстки.
Тестирование мобильной версии важно интегрировать в автоматические пайплайны. Protractor совместим с Jenkins, GitLab CI и GitHub Actions. Основные моменты:
--headless,
--disable-gpu) для ускорения тестов.multiCapabilities.afterEach(async function() {
let png = await browser.takeScreenshot();
require('fs').writeFileSync('screenshot.png', png, {encoding: 'base64'});
});
Эта стратегия обеспечивает стабильное тестирование мобильных версий сайтов на разных разрешениях и устройствах без физического подключения реальных девайсов.