WebdriverIO предоставляет мощные возможности для взаимодействия с веб-страницей и получения данных из неё. Одним из ключевых инструментов для этого является использование JavaScript-кода внутри тестов. Это позволяет напрямую обращаться к DOM, получать значения элементов, атрибуты и свойства объектов.
browser.execute — основной метод для
выполнения произвольного JavaScript в контексте открытой страницы.
Позволяет передавать аргументы в скрипт и получать результат:
const title = browser.execute(() => {
return document.title;
});
console.log(title); // Выводит заголовок страницы
const elementText = browser.execute((selector) => {
return document.querySelector(selector).textContent;
}, '#main-title');
browser.executeAsync используется для
асинхронного кода, например, при работе с промисами или таймерами на
странице:
const result = browser.executeAsync((done) => {
setTimeout(() => {
done(document.readyState);
}, 1000);
});
console.log(result); // 'complete' после выполнения
WebdriverIO предоставляет встроенные методы для получения текста и атрибутов, но иногда требуется более гибкий подход через JavaScript.
const text = browser.execute((selector) => {
return document.querySelector(selector).innerText;
}, '.header');
const href = browser.execute((selector) => {
return document.querySelector(selector).getAttribute('href');
}, 'a.link');
const isChecked = browser.execute((selector) => {
return document.querySelector(selector).checked;
}, '#accept-terms');
Использование прямого обращения к DOM через execute
позволяет получить данные, которые не доступны через стандартные методы
WebdriverIO или Selenium.
Часто требуется собрать информацию сразу с нескольких элементов. Для этого удобно использовать методы массивов в Jav * aScript:
const items = browser.execute(() => {
return Array.from(document.querySelectorAll('.item')).map(el => el.textContent);
});
console.log(items); // ['Элемент 1', 'Элемент 2', 'Элемент 3']
Array.from позволяет преобразовать NodeList в
массив.map помогает получить нужное свойство каждого элемента,
например textContent, href,
value.Можно собирать данные не только с конкретных элементов, но и о состоянии всей страницы:
const currentUrl = browser.execute(() => window.location.href);
const pageTitle = browser.execute(() => document.title);
const viewport = browser.execute(() => ({
width: window.innerWidth,
height: window.innerHeight,
scrollY: window.scrollY
}));
Через JavaScript можно не только читать данные, но и изменять их свойства или вызывать события:
browser.execute((selector) => {
const input = document.querySelector(selector);
input.value = 'Тестовое значение';
input.dispatchEvent(new Event('input'));
}, '#search');
dispatchEvent позволяет эмулировать события, которые
обычно вызываются пользователем.С помощью JavaScript можно решать задачи, недоступные стандартными методами WebdriverIO:
getText()
возвращает пустую строку.const shadowText = browser.execute(() => {
const shadowRoot = document.querySelector('#shadow-host').shadowRoot;
return shadowRoot.querySelector('.shadow-element').textContent;
});
fetch для
проверки API прямо на странице:const data = browser.executeAsync((done) => {
fetch('/api/data')
.then(res => res.json())
.then(json => done(json));
});
getText,
getAttribute. JavaScript следует применять при
нестандартных задачах.execute, сериализуются,
поэтому нельзя передавать сложные объекты с функциями.executeAsync, иначе
тест не дождётся результата.Использование browser.execute и
browser.executeAsync раскрывает возможности WebdriverIO для
гибкого анализа страниц, работы с DOM, получения атрибутов, состояния
элементов и выполнения сценариев, которые невозможно реализовать только
через стандартные методы библиотеки. Это позволяет создавать надежные,
быстрые и точные тесты, контролирующие все аспекты поведения
веб-страницы.