Класс Actions и его методы

В WebdriverIO класс Actions используется для работы с низкоуровневыми пользовательскими взаимодействиями с элементами веб-страницы. Он позволяет моделировать сложные сценарии, такие как перетаскивание, масштабирование, касания и нажатия клавиш. Использование Actions даёт возможность управлять событиями браузера на уровне протокола WebDriver, что особенно важно при тестировании динамических интерфейсов.

Создание экземпляра Actions

Экземпляр класса Actions не создаётся напрямую через new. Вместо этого используется метод browser.action():

const action = browser.action('pointer', { pointerType: 'mouse' });
  • Первый аргумент — тип действия ('pointer' или 'key').
  • Второй аргумент — дополнительные параметры, например pointerType: 'mouse' или 'touch'.

Существуют два основных типа действий:

  1. Pointer Actions — управление мышью, сенсорными экранами и стилусами.
  2. Key Actions — имитация нажатий клавиш на клавиатуре.

Методы для работы с мышью

move({x, y, origin})

Перемещает указатель мыши к заданной точке.

  • x и y — координаты относительно origin.
  • origin — элемент или 'pointer', относительно которого выполняется движение.

Пример перемещения к элементу и клика:

const button = $('#submit');
action
    .move({ origin: button })
    .press()
    .release()
    .perform();
press() и release()
  • press() — нажатие кнопки мыши (по умолчанию левая).
  • release() — отпускание кнопки.
pointerMove()

Позволяет перемещать указатель по экрану с указанием смещения или координат. Отличается от move возможностью точного контроля скорости и траектории движения.

doubleClick()

Сочетает последовательность press и release дважды для эмуляции двойного клика.

Методы для клавиатуры

keyDown(key) и keyUp(key)

Используются для имитации нажатий клавиш:

action
    .keyDown('Control')
    .keyDown('a')
    .keyUp('a')
    .keyUp('Control')
    .perform();

Позволяет комбинировать клавиши для шорткатов, например Ctrl + A.

sendKeys(keys)

Отправляет последовательность символов в активный элемент:

action
    .sendKeys('Hello World')
    .perform();

Поддерживает специальные клавиши через объект Key, например Key.Enter, Key.Tab.

Композиция действий

Класс Actions позволяет создавать цепочки событий, которые выполняются одной командой .perform(). Все вызовы методов до perform() сохраняются в очереди:

const input = $('#input');
action
    .move({ origin: input })
    .press()
    .sendKeys('Test Input')
    .release()
    .perform();

В этом примере последовательно выполняется: перемещение к элементу, клик, ввод текста и отпускание кнопки мыши.

Touch Actions

Для мобильного тестирования используются сенсорные действия:

  • tap({ x, y, origin }) — имитация касания.
  • doubleTap({ x, y, origin }) — двойное касание.
  • longPress({ x, y, duration }) — удержание пальца на элементе заданное время.
  • swipe({ start, end, duration }) — имитация свайпа по координатам.

Пример свайпа по элементу:

const slider = $('#slider');
action
    .move({ origin: slider })
    .press()
    .move({ origin: slider, x: 100, y: 0 })
    .release()
    .perform();

Особенности использования Actions

  • Производительность: цепочки действий выполняются быстро, так как отправляются как одна команда WebDriver.
  • Совместимость: не все драйверы поддерживают полный набор методов. Проверка через документацию WebDriver обязательна.
  • Синхронизация: в отличие от обычных команд WebdriverIO (click(), setValue()), Actions не ждут автоматического появления элементов, поэтому рекомендуется использовать явное ожидание перед действиями.

Пример сложного сценария

Эмуляция Drag & Drop с клавишей модификатором:

const source = $('#source');
const target = $('#target');

action
    .keyDown('Shift')
    .move({ origin: source })
    .press()
    .move({ origin: target })
    .release()
    .keyUp('Shift')
    .perform();

Здесь имитируется перенос элемента с удержанием клавиши Shift, что полезно для многократного выбора в интерфейсах типа файловых менеджеров.

Резюме по методам

  • Pointer Actions: move, press, release, pointerMove, doubleClick.
  • Keyboard Actions: keyDown, keyUp, sendKeys.
  • Touch Actions: tap, doubleTap, longPress, swipe.
  • Композиция: все действия накапливаются до вызова .perform().
  • Управление элементами: координаты и origin позволяют точно позиционировать взаимодействия.

Класс Actions обеспечивает гибкое управление сложными сценариями взаимодействия с веб-страницей, объединяя работу с мышью, клавиатурой и сенсорными устройствами в единую цепочку команд.