Shepherd.js — это библиотека для создания интерактивных пошаговых руководств по пользовательскому интерфейсу. Она позволяет выделять элементы страницы, показывать подсказки и управлять последовательностью действий пользователя.
Основная единица в Shepherd — шаг (step), который описывает, какой элемент страницы нужно выделить, что показать и как реагировать на действия пользователя.
const tour = new Shepherd.Tour({
defaultStepOptions: {
classes: 'shepherd-theme-arrows',
scrollTo: true
}
});
tour.addStep({
id: 'example-step',
text: 'Это пример шага.',
attachTo: { element: '#button', on: 'bottom' },
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
В этом примере создаётся тур с одним шагом, который привязан к
элементу #button. Параметр scrollTo
автоматически прокручивает страницу к элементу, если он не виден.
Каждый шаг может содержать следующие ключевые свойства:
id — уникальный идентификатор шага.text — текст подсказки. Можно использовать HTML.attachTo — объект с полями element и
on, определяющий привязку к DOM-элементу.buttons — массив кнопок с действиями
(action) типа tour.next(),
tour.back() или пользовательскими функциями.classes — CSS-классы для стилизации.when — объект для обработки событий шага
(show, hide, complete).tour.addStep({
id: 'event-step',
text: 'Шаг с событиями.',
attachTo: { element: '#input', on: 'right' },
when: {
show: () => console.log('Шаг показан'),
hide: () => console.log('Шаг скрыт')
},
buttons: [
{ text: 'Назад', action: tour.back },
{ text: 'Далее', action: tour.next }
]
});
При тестировании интерактивных туров важно не запускать их полностью в реальном DOM, а использовать моки и стабы, чтобы эмулировать поведение шагов и кнопок. Это позволяет проверять логику последовательности шагов без необходимости взаимодействия пользователя.
Stub-шаг может быть объектом с методами show,
hide и destroy, которые имитируют поведение
реального шага:
function createStepStub() {
return {
show: jest.fn(),
hide: jest.fn(),
destroy: jest.fn(),
on: jest.fn()
};
}
const stepStub = createStepStub();
Здесь используется jest.fn(), чтобы отслеживать вызовы
методов. В тестах можно проверять, что show() был вызван
при переходе к шагу:
tour.addStep(stepStub);
tour.start();
expect(stepStub.show).toHaveBeenCalled();
Для тестирования логики тура удобно создать мок-тур:
function createTourStub() {
return {
addStep: jest.fn(),
next: jest.fn(),
back: jest.fn(),
start: jest.fn(),
cancel: jest.fn(),
};
}
const tourStub = createTourStub();
tourStub.addStep(stepStub);
tourStub.start();
expect(tourStub.start).toHaveBeenCalled();
С помощью такого подхода можно проверять:
show, hide,
complete).Shepherd.js полностью поддерживает тестирование через Jest или аналогичные инструменты. Примеры тестов включают проверку:
test('Step shows on tour start', () => {
const step = createStepStub();
const tour = createTourStub();
tour.addStep(step);
tour.start();
expect(step.show).toHaveBeenCalledTimes(1);
});
Для более сложных тестов можно создавать стабы кнопок и событий:
const nextButton = {
action: jest.fn()
};
stepStub.buttons = [nextButton];
stepStub.show();
nextButton.action();
expect(nextButton.action).toHaveBeenCalled();
Это позволяет проверить, что при нажатии кнопки вызывается нужное действие без реального DOM.
show, hide и
destroy для шагов;addStep,
next, back и start;Такой подход делает тестирование Shepherd.js масштабируемым и предсказуемым, позволяя интегрировать пошаговые туры в сложные интерфейсы без риска поломки автоматических тестов.