WebdriverIO предоставляет мощные возможности для взаимодействия с веб-страницами, включая выполнение произвольного JavaScript кода внутри контекста браузера. Это особенно важно для задач, которые невозможно выполнить через стандартные методы API, например, получение сложных значений из DOM, манипуляции с элементами или вызов внутренних функций приложения.
browser.execute()Метод execute позволяет выполнить JavaScript код на
странице и вернуть результат в тестовый скрипт. Синтаксис:
const result = await browser.execute((arg1, arg2) => {
// код, который будет выполнен в браузере
return document.title + ' - ' + arg1 + ' - ' + arg2;
}, 'значение1', 'значение2');
console.log(result); // выводит результат выполнения кода
Особенности использования:
browser.executeAsync()Для работы с асинхронным кодом используется
executeAsync. Она ожидает вызов специального callback для
завершения выполнения:
const result = await browser.executeAsync((done) => {
setTimeout(() => {
done('Асинхронный результат');
}, 1000);
});
console.log(result); // 'Асинхронный результат'
Особенности:
done при
завершении.fetch.1. Получение текста всех элементов списка
const items = await browser.execute(() => {
return Array.from(document.querySelectorAll('ul li')).map(el => el.textContent);
});
console.log(items);
2. Скроллинг страницы до нужного элемента
await browser.execute((selector) => {
const element = document.querySelector(selector);
if (element) {
element.scrollIntoView({ beh * avior: 'smooth', block: 'center' });
}
}, '#target-element');
3. Вызов функций приложения, определённых в глобальном контексте
const userData = await browser.execute(() => {
return window.getUserData(); // функция определена в скриптах страницы
});
console.log(userData);
4. Модификация DOM элементов
await browser.execute(() => {
document.body.style.backgroundColor = 'lightblue';
});
Методы execute и executeAsync автоматически
сериализуют данные между Node.js и браузером. Поддерживаются следующие
типы:
string, number,
boolean, null, undefinedWebElement объекты, полученные через селекторы
WebdriverIOВозвращаемые значения автоматически десериализуются и могут быть использованы как обычные JavaScript объекты в тесте.
execute, так как это может увеличить время выполнения
тестов.WebdriverIO позволяет комбинировать execute с
элементами:
const text = await browser.execute((el) => el.textContent, await $('#my-element'));
console.log(text);
Здесь WebdriverIO автоматически передаст объект элемента в контекст браузера. Это упрощает манипуляции с конкретными элементами, не полагаясь на глобальные селекторы.
Для удобства отладки можно выводить результаты прямо в консоль браузера:
await browser.execute(() => {
console.log('Тестовое сообщение', document.title);
});
Кроме того, можно использовать debugger; внутри функции,
чтобы остановить выполнение кода при подключении к DevTools.
Использование методов execute и
executeAsync делает WebdriverIO универсальным инструментом
для автоматизации сложных сценариев тестирования, предоставляя полный
контроль над DOM и внутренними функциями веб-приложения.