Цепочки действий (Action Chains) в WebdriverIO позволяют создавать
последовательность интерактивных действий с элементами страницы,
имитируя поведение пользователя. Этот подход особенно полезен для
сложных сценариев, включающих наведение мыши, перетаскивание, нажатия
клавиш и другие взаимодействия, которые невозможно реализовать
стандартными командами click() или
setValue().
В WebdriverIO используется объект browser.actions(),
который позволяет строить цепочку действий. Каждое действие добавляется
к цепочке и выполняется при вызове метода perform().
Примеры базовых действий:
move({ x, y, origin }) — перемещает курсор мыши к
указанным координатам или элементу.click({ button, x, y }) — выполняет клик мышью. Можно
указать конкретную кнопку (left, middle,
right) и координаты относительно элемента.doubleClick() — двойной клик мышью.contextClick() — клик правой кнопкой мыши.pointerDown() и pointerUp() — имитация
нажатия и отпускания кнопки мыши, что используется для
drag-and-drop.Каждое действие можно комбинировать с другими, формируя сложные сценарии.
const elem = await $('#draggable');
await browser.actions()
.move({ origin: elem }) // Навести мышь на элемент
.pointerDown() // Нажать и удерживать левую кнопку мыши
.move({ x: 100, y: 50 }) // Переместить на новые координаты
.pointerUp() // Отпустить кнопку мыши
.perform(); // Выполнить все действия
В данном примере реализовано перетаскивание элемента. Метод
perform() выполняет все добавленные действия
последовательно.
Цепочки действий позволяют сочетать взаимодействие мыши и клавиатуры. Методы для работы с клавиатурой:
keyDown(value) — нажать клавишу.keyUp(value) — отпустить клавишу.pause(ms) — сделать паузу между действиями (в
миллисекундах).Пример: ввод текста с удержанием клавиши Shift:
await browser.actions()
.keyDown('Shift') // Нажать Shift
.sendKeys('webdriverio') // Ввести текст заглавными буквами
.keyUp('Shift') // Отпустить Shift
.perform();
Наведение мыши (hover) часто требуется для раскрытия
выпадающих меню или отображения подсказок. Цепочка действий позволяет
точно указать элемент и координаты.
const menu = await $('#menu-item');
await browser.actions()
.move({ origin: menu }) // Навести курсор на элемент
.pause(500) // Небольшая задержка для появления подменю
.click() // Клик по элементу подменю
.perform();
Метод pause() обеспечивает синхронизацию с динамическим
контентом, когда простого waitForDisplayed()
недостаточно.
Одно из самых частых применений цепочек действий — drag-and-drop. Можно использовать как абсолютные координаты, так и элементы.
const source = await $('#source');
const target = await $('#target');
await browser.actions()
.move({ origin: source }) // Навести на исходный элемент
.pointerDown() // Нажать кнопку мыши
.move({ origin: target }) // Переместить к целевому элементу
.pointerUp() // Отпустить кнопку мыши
.perform();
WebdriverIO поддерживает микширование действий мыши и клавиатуры в одной цепочке, что полезно для сложных интерфейсов, например, редактирования текста с выделением и копированием:
const input = await $('#input-field');
await browser.actions()
.move({ origin: input })
.click()
.keyDown('Control')
.sendKeys('a') // Выделить весь текст
.keyUp('Control')
.keyDown('Control')
.sendKeys('c') // Скопировать текст
.keyUp('Control')
.perform();
pause() или
waitForDisplayed() помогают избежать ошибок при
взаимодействии с динамическим контентом.browser.actions().move,
click, keyDown и др.).perform().Цепочки действий обеспечивают высокий уровень контроля над автоматизированными тестами, позволяя имитировать практически любое пользовательское взаимодействие на странице.