В автоматизированном тестировании веб-приложений на Angular с использованием Protractor ключевым аспектом является возможность взаимодействия с функциями приложения напрямую через браузер. Это позволяет выполнять сложные сценарии тестирования, манипулировать состоянием приложения и проверять результаты в реальном времени.
browser.executeScript и
browser.executeAsyncScriptProtractor предоставляет два метода для вызова JavaScript-кода в контексте страницы:
browser.executeScript — выполняет
синхронный JavaScript-код и возвращает результат.browser.executeAsyncScript — выполняет
асинхронный JavaScript-код с использованием обратного вызова
callback.Пример синхронного вызова функции:
let result = await browser.executeScript('return window.myApp.calculateSum(2, 3);');
console.log(result); // 5
Пример асинхронного вызова:
let result = await browser.executeAsyncScript(function(a, b, callback) {
window.myApp.calculateAsync(a, b).then(callback);
}, 4, 5);
console.log(result); // 9
Ключевые моменты:
Promise.executeScript немедленно
отражаются на странице.ng.probeДля глубокого взаимодействия с компонентами Angular можно
использовать ng.probe, доступный в режиме отладки Angular
(включается через debugElement).
Пример получения экземпляра компонента и вызова метода:
let componentInstance = await browser.executeScript(() => {
const debugEl = ng.probe(document.querySelector('app-root'));
return debugEl.componentInstance;
});
await browser.executeScript(instance => {
instance.performAction();
}, componentInstance);
Особенности:
ng.probe.Angular использует зону (NgZone) для отслеживания
изменений и обновления представления. Прямой вызов функций вне зоны
может не инициировать обновление данных в интерфейсе. Для корректной
работы используют browser.executeScript с
NgZone.run:
await browser.executeScript(() => {
const appRoot = document.querySelector('app-root');
ng.probe(appRoot).injector.get(ng.coreTokens.NgZone).run(() => {
ng.probe(appRoot).componentInstance.updateData('new value');
});
});
Преимущества подхода:
browser.wait.Protractor позволяет передавать любые данные в вызываемый скрипт, включая строки, числа, объекты и массивы. Аргументы передаются после самой функции и доступны как параметры.
Пример передачи объекта:
let data = { name: 'Test', count: 10 };
await browser.executeScript((obj) => {
window.myApp.processData(obj);
}, data);
Важно:
Если вызываемая функция возвращает Promise, Protractor
автоматически ожидает её разрешения в executeAsyncScript.
Пример:
let result = await browser.executeAsyncScript((callback) => {
fetch('/api/data')
.then(response => response.json())
.then(data => callback(data));
});
console.log(result);
Особенности:
await с executeAsyncScript
гарантирует, что тест не продолжится до получения результата.Прямой вызов функций приложения позволяет:
Пример подготовки данных:
await browser.executeScript(() => {
window.myApp.resetDatabase();
window.myApp.addTestUser({ username: 'user1', role: 'admin' });
});
Рекомендации по использованию:
Protractor позволяет отлаживать скрипты через:
browser.pause() — приостанавливает тест и открывает
REPL для интерактивного исполнения команд.console.log внутри executeScript — выводит
данные в браузерную консоль, что удобно для проверки промежуточных
результатов.Пример:
await browser.executeScript(() => {
console.log('Current state:', window.myApp.state);
});