В Protractor hooks представляют собой специальные функции, которые выполняются в определённые моменты жизненного цикла теста. Их использование позволяет управлять поведением тестов, настраивать окружение, выполнять подготовительные действия перед запуском сценариев и обрабатывать результаты после выполнения тестов. Hooks критически важны для поддержания чистоты тестовой среды и обеспечения предсказуемости тестов.
Protractor использует подход Jasmine или Mocha для определения жизненного цикла тестов. Соответственно, hooks делятся на несколько категорий:
beforeAll / afterAll
describe.describe('Тестирование авторизации', () => {
beforeAll(async () => {
await browser.get('https://example.com/login');
await element(by.id('username')).sendKeys('admin');
await element(by.id('password')).sendKeys('12345');
await element(by.id('loginBtn')).click();
});
afterAll(async () => {
await browser.quit();
});
it('Проверка успешного входа', async () => {
expect(await element(by.css('.welcome')).isDisplayed()).toBe(true);
});
});beforeEach / afterEach
it.beforeEach(async () => {
await browser.get('https://example.com');
});
afterEach(async () => {
const logs = await browser.manage().logs().get('browser');
if (logs.length) {
console.log('Логи браузера:', logs);
}
});Protractor построен на Promise и async/await. Все
hooks, выполняющие асинхронные операции (например,
browser.get, взаимодействие с элементами), должны
использовать async и await. Без этого возможны
гонки данных и непредсказуемые ошибки.
beforeEach(async () => {
await browser.get('https://example.com/dashboard');
});
Использование обычной функции без async приведёт к тому,
что тест будет запускаться до завершения загрузки страницы, что вызовет
падение проверки.
Hooks позволяют создавать гибкую структуру тестов:
afterEach можно
использовать для очистки кук, локального хранилища или базы данных.afterEach.beforeEach
можно проверять окружение и пропускать тесты в неподходящих
условиях.Пример записи скриншота при падении теста:
afterEach(async function () {
if (this.currentTest.state === 'failed') {
const png = await browser.takeScreenshot();
require('fs').writeFileSync(`./screenshots/${this.currentTest.title}.png`, png, 'base64');
}
});
Использование Page Object Model совместно с hooks повышает читаемость и переиспользуемость кода. Hooks отвечают за подготовку и очистку, Page Objects — за взаимодействие с элементами.
const LoginPage = require('./pages/login.page');
describe('Тестирование Login', () => {
const loginPage = new LoginPage();
beforeEach(async () => {
await loginPage.open();
});
it('Ввод корректных данных', async () => {
await loginPage.login('admin', '12345');
expect(await loginPage.isWelcomeVisible()).toBe(true);
});
afterEach(async () => {
await loginPage.clearSession();
});
});
beforeAll для ускорения выполнения тестов.afterEach для сброса
состояния, чтобы тесты оставались независимыми.describe
логически, чтобы hooks применялись только к нужным
сценариям.Hooks в Protractor формируют основу управления жизненным циклом тестов, обеспечивают стабильность сценариев и дают возможность масштабировать автоматизацию без потери контроля над состоянием среды и результатами тестирования.