Отпускание клавиш и кнопок мыши

В WebdriverIO управление вводом с клавиатуры и мыши реализуется через actions API, которое предоставляет методы для имитации нажатий и отпусканий клавиш, кликов мышью, перемещений курсора и сложных комбинаций действий. Это особенно важно при автоматизации тестирования интерактивных элементов, таких как кнопки, поля ввода, drag-and-drop интерфейсы и горячие клавиши.


Отпускание клавиш клавиатуры (releaseKeys)

Для симуляции нажатия и отпускания клавиш используется комбинация методов keys() и releaseKeys() (или performActions с соответствующими параметрами). В WebdriverIO ключи передаются как строки или объекты с описанием модификаторов.

Пример базового сценария:

// Нажать клавишу Shift и ввести букву
await browser.keys(['Shift', 'a']);
// Отпустить клавишу Shift
await browser.releaseKeys('Shift');

Особенности работы:

  • Метод keys() автоматически “удерживает” модификаторы (Shift, Control, Alt) до явного их отпускания.
  • Если не вызвать releaseKeys(), последующие нажатия могут некорректно интерпретироваться браузером.
  • Для нескольких клавиш можно использовать массив:
await browser.keys(['Control', 'a']); // Ctrl+A для выделения текста
await browser.releaseKeys(['Control']);
  • Для сложных последовательностей удобнее использовать performActions с типом "key":
await browser.performActions([{
    type: 'key',
    id: 'keyboard1',
    actions: [
        { type: 'keyDown', value: 'Shift' },
        { type: 'keyDown', value: 'A' },
        { type: 'keyUp', value: 'A' },
        { type: 'keyUp', value: 'Shift' }
    ]
}]);

Этот подход дает полный контроль над временем удержания клавиш и последовательностью нажатий.


Отпускание кнопок мыши

Управление мышью в WebdriverIO также реализуется через actions() или через старые методы click() и doubleClick(). Для симуляции удержания и отпускания кнопки мыши используются события "pointerDown" и "pointerUp".

Пример клика с удержанием и отпусканием:

// Переместить курсор на элемент
const button = await $('#submit');
await button.scrollIntoView();

// Удерживаем левую кнопку мыши
await browser.performActions([{
    type: 'pointer',
    id: 'mouse1',
    parameters: { pointerType: 'mouse' },
    actions: [
        { type: 'pointerMove', origin: button, x: 0, y: 0 },
        { type: 'pointerDown', button: 0 },  // левая кнопка
        { type: 'pause', duration: 500 },    // удерживаем 500ms
        { type: 'pointerUp', button: 0 }     // отпускаем кнопку
    ]
}]);

Ключевые моменты:

  • pointerDown инициирует нажатие кнопки. Параметр button принимает значения:

    • 0 — левая кнопка
    • 1 — средняя кнопка
    • 2 — правая кнопка
  • pointerUp завершает нажатие.

  • Метод pause позволяет эмулировать задержку удержания, что важно для drag-and-drop или тестирования долгих кликов.


Комбинированные действия клавиатуры и мыши

WebdriverIO позволяет объединять клавиатурные и мышиные действия в одной последовательности. Это необходимо, например, для тестирования контекстных меню с модификаторами:

await browser.performActions([
    {
        type: 'pointer',
        id: 'mouse1',
        parameters: { pointerType: 'mouse' },
        actions: [
            { type: 'pointerMove', origin: await $('#element'), x: 0, y: 0 },
            { type: 'pointerDown', button: 2 }, // правая кнопка
            { type: 'pointerUp', button: 2 }
        ]
    },
    {
        type: 'key',
        id: 'keyboard1',
        actions: [
            { type: 'keyDown', value: 'Shift' },
            { type: 'keyUp', value: 'Shift' }
        ]
    }
]);

Такой подход обеспечивает реалистичное поведение пользователя, когда клавиши и мышь используются одновременно.


Советы по использованию release-операций

  1. Явное отпускание клавиш и кнопок предотвращает зависания модификаторов или некорректное поведение тестов.
  2. Использование performActions предпочтительнее для сложных сценариев, так как оно полностью управляет потоками действий.
  3. Паузы (pause) между нажатиями и отпусканиями помогают избежать срабатывания асинхронных событий раньше времени.
  4. Комбинирование действий в одном performActions снижает риск конфликтов между различными потоками ввода.

Особенности WebdriverIO 8+

  • Полная поддержка W3C Actions API, что обеспечивает кросс-браузерное поведение для клавиатуры и мыши.
  • Методы keys и releaseKeys стали удобными для быстрых клавиатурных сценариев.
  • performActions позволяет управлять несколькими устройствами ввода одновременно (мышь + клавиатура + сенсорный экран).

Эти возможности делают WebdriverIO мощным инструментом для автоматизации сложных пользовательских интеракций, где важно точное управление отпусканием клавиш и кнопок мыши.