Protractor предоставляет возможность напрямую взаимодействовать с веб-страницей через выполнение JavaScript-кода в контексте браузера. Это особенно полезно, когда стандартные методы работы с элементами недостаточны или необходимо получить доступ к внутренним данным страницы, которые не доступны через обычные локаторы.
browser.executeScriptМетод executeScript позволяет выполнить произвольный
JavaScript на странице. Его синтаксис следующий:
browser.executeScript(script, ...args)
Пример использования:
// Получение заголовка страницы через JS
const title = await browser.executeScript('return document.title;');
console.log(title);
Если передать функцию:
const innerText = await browser.executeScript(function(element) {
return element.innerText;
}, elementFinder);
В этом примере elementFinder — это объект Protractor,
который будет автоматически преобразован в соответствующий DOM-элемент
внутри браузера.
browser.executeAsyncScriptМетод executeAsyncScript используется, когда необходимо
выполнить асинхронный JavaScript. В функцию автоматически передается
callback, который должен быть вызван для возврата результата в тест:
browser.executeAsyncScript(script, ...args)
Пример:
const result = await browser.executeAsyncScript(function(callback) {
setTimeout(function() {
callback('Асинхронный результат');
}, 1000);
});
console.log(result); // 'Асинхронный результат'
Асинхронное выполнение особенно важно для работы с AJAX-запросами или задержками на странице.
ElementFinderProtractor предоставляет ElementFinder и
ElementArrayFinder для работы с элементами. При выполнении
скриптов через executeScript ElementFinder
автоматически преобразуется в реальный DOM-элемент:
const elem = element(by.css('.my-class'));
const text = await browser.executeScript(function(el) {
return el.textContent;
}, elem);
console.log(text);
Для массивов элементов можно использовать executeScript
аналогично:
const elems = element.all(by.css('.item'));
const texts = await browser.executeScript(function(elements) {
return elements.map(e => e.textContent);
}, elems.getWebElements());
console.log(texts);
Выполнение JavaScript позволяет напрямую менять свойства элементов, стили или атрибуты:
const elem = element(by.id('my-button'));
await browser.executeScript(function(el) {
el.style.backgroundColor = 'red';
el.setAttribute('disabled', 'true');
}, elem);
Это полезно для тестирования визуальных состояний элементов или временного изменения поведения страницы без перезагрузки.
executeScript предоставляет доступ к глобальным объектам
браузера, таким как window, document или любые
пользовательские объекты:
const userData = await browser.executeScript('return window.userData;');
console.log(userData);
Можно использовать сложные конструкции, например, вызов функций, определенных на странице:
await browser.executeScript('return window.calculateSum(5, 10);');
require, недоступны.executeAsyncScript.executeScript,
автоматически сериализуются, поэтому функции и DOM-элементы возвращены
не будут — только данные примитивного типа или объекты.executeScript, чтобы не создавать сложные зависимости от
внутренней реализации страницы.Этот подход обеспечивает гибкость тестирования, позволяя работать с любыми аспектами страницы, которые недоступны стандартными методами Protractor.