Инъекция сторонних библиотек в тестируемое веб-приложение позволяет
расширить возможности автоматизации, упрощает выбор элементов и
выполнение сложных операций с DOM. В WebdriverIO это реализуется через
выполнение скриптов в контексте страницы с использованием метода
browser.execute.
jQuery предоставляет удобный синтаксис для поиска элементов, манипуляций с DOM и работы с событиями. Если веб-приложение не использует jQuery, её можно динамически подключить:
const jqueryUrl = 'https://code.jquery.com/jquery-3.6.0.min.js';
browser.execute((url) => {
if (!window.jQuery) {
const script = document.createElement('script');
script.src = url;
script.type = 'text/javascript';
script.onl oad = () => console.log('jQuery загружен');
document.head.appendChild(script);
}
}, jqueryUrl);
Особенности подхода:
if (!window.jQuery) предотвращает повторную
загрузку библиотеки.browser.execute выполняет функцию в контексте
браузера, что позволяет работать с глобальными объектами страницы.onload используется для отслеживания завершения
загрузки, но в тестах часто достаточно паузы или ожидания
элементов.После инъекции можно использовать jQuery для поиска элементов и выполнения действий:
browser.execute(() => {
$('button.submit').click();
});
Любую JavaScript-библиотеку можно подключить аналогично jQuery.
Необходимо указать URL скрипта и использовать
browser.execute:
const libraryUrl = 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js';
browser.execute((url) => {
if (!window._) {
const script = document.createElement('script');
script.src = url;
script.type = 'text/javascript';
document.head.appendChild(script);
}
}, libraryUrl);
После этого глобальная переменная библиотеки доступна в контексте страницы, и её функции можно использовать для обработки данных, фильтрации массивов или любых других операций:
browser.execute(() => {
const arr = [1, 2, 3, 4, 5];
console.log(_.shuffle(arr));
});
Если библиотека загружается асинхронно, важно дождаться её полной
загрузки перед использованием. Один из подходов — использовать промисы
внутри browser.executeAsync:
const jqueryUrl = 'https://code.jquery.com/jquery-3.6.0.min.js';
browser.executeAsync((url, done) => {
if (!window.jQuery) {
const script = document.createElement('script');
script.src = url;
script.type = 'text/javascript';
script.onl oad = () => done(true);
document.head.appendChild(script);
} else {
done(true);
}
}, jqueryUrl);
Метод executeAsync позволяет WebdriverIO дождаться
завершения выполнения кода в браузере перед продолжением теста.
Подключение сторонней библиотеки может вызвать конфликт с существующими скриптами страницы. Чтобы избежать этого:
jQuery.noConflict(), если на странице уже
есть другая версия jQuery.Пример с noConflict:
browser.execute(() => {
const $j = jQuery.noConflict(true);
$j('button.submit').click();
});
Инъекция библиотек особенно полезна для:
Эффективное использование динамической загрузки jQuery и других библиотек позволяет существенно сократить сложность тестов и повысить гибкость автоматизации в WebdriverIO.