Как имитировать длительное нажатие клавиши на кипарисе?

Я хочу имитировать долгое нажатие клавиши обратной кавычки без выбора определенного элемента dom, как мы можем добиться этого с помощью кипариса? У меня есть функция в моем веб-приложении, которая срабатывает при нажатии этой клавиши.

Я пробовал несколько кодов ниже, и ничего не работает.

// 1st
cy.get('#sidepanel').trigger('keydown', { keycode: 192, release: false })

// 2nd
cy.get('body').type('`', { release: false })

// 3rd
cy.get('body').trigger('keydown', { keycode: 192, release: false })
cy.wait(15000)
cy.get('body').trigger('keyup', { keycode: 192, release: false })

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
6 884
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Когда вы удерживаете клавишу в браузере, на самом деле это заканчивается множеством последующих событий keydown/keypress, за которыми следует keyup, когда вы, наконец, отпускаете клавишу.

Вы можете проверить это поведение, запустив этот код в своем браузере:

['keydown','keypress','keyup'].map(e => {
  document.addEventListener(e, (p) => console.info(e, p))
})

Затем, удерживая нажатой клавишу, просмотрите журнал консоли, чтобы узнать, какие события генерируются. В Firefox удержание клавиши A дает:

Screenshot of holding down A key


Итак, чтобы сделать это с Cypress, вам просто нужно эмулировать эти события:

// holding down for 5 seconds
for (var i = 0; i < 100; i++) {
  cy.get('body').trigger('keydown', { keycode: 192, release: false })
  cy.get('body').trigger('keypress', { keycode: 192, release: false })
  cy.wait(50)
}
cy.get('body').trigger('keyup', { keycode: 192, release: false })
Ответ принят как подходящий

Я не знаю почему, но когда несколько месяцев назад пытался ответить Зак Блумквист, это не сработало. Только сейчас еще раз попробовал, работает. Я попробовал это на другой машине и переустановил кипарис версии 3.3.2. Не совсем уверен, что это имеет другое влияние.

Почему-то решение от Зака ​​не дает точного времени нажатия клавиши. Запуск его решения фактически будет нажимать клавишу в течение 28 секунд во время выполнения Cypress.

// expect: holding down for 5 seconds
// actual: cypress will hold the keys for 28 seconds
for (var i = 0; i < 100; i++) {
  cy.get('body').trigger('keydown', { keycode: 192, release: false })
  cy.get('body').trigger('keypress', { keycode: 192, release: false })
  cy.wait(50)
}
cy.get('body').trigger('keyup', { keycode: 192, release: false })

Я придумал более простое решение, которое соответствует почти фактическому времени нажатия при запуске в кипарисе:

cy.get('body').trigger('keydown', { keyCode: 192 })
cy.wait(duration)
cy.get('body').trigger('keyup', { keyCode: 192 })

Если вы ясно видите, что это решение такое же, как и мой третий вариант в вопросе. Раньше не работало, а теперь работает. Что я заметил, так это тип браузера при запуске Cypress. Раньше это был хром, теперь это Electron 61. Может быть, это причина, нужно провести дальнейшее расследование, чтобы подтвердить.

В моем случае это сработало, чтобы явно установить в следующих событиях клавишу ctrl. В этом примере это позволило мне имитировать Ctrl+Click плюс движение мыши.

cy.get(target).focus();
cy.get(target).type('{ctrl}', { release: false });
cy.get(target).trigger('mousedown', point.x, point.y, { eventConstructor: 'MouseEvent', button: 0, ctrlKey: true, force: true })
point.x += -200;
point.y += 100;
cy.get(target).trigger('mousemove', point.x, point.y, { eventConstructor: 'MouseEvent', ctrlKey: true, force: true });
cy.wait(250);
point.x += -20;
point.y += 100;
cy.get(target).trigger('mousemove', point.x, point.y, { eventConstructor: 'MouseEvent', ctrlKey: true, force: true });
cy.get(target).trigger('mouseup', point.x, point.y, { eventConstructor: 'MouseEvent', ctrlKey: true, button: 0, force: true });
cy.get(target).trigger('mouseover', point.x, point.y, { eventConstructor: 'MouseEvent', ctrlKey: true, button: 0, force: true });
cy.get(target).type('{ctrl}');

Я не думаю, что все аргументы необходимы, но eventConstructor, ctrlKey и кнопка были важны в моем процессе.

принятый вопрос, все в порядке. Но для меня работает смена кода ключа на код ключа

// expect: holding down for 5 seconds
// actual: cypress will hold the keys for 28 seconds
for (var i = 0; i < 100; i++) {
  cy.get('body').trigger('keydown', { keyCode: 87, release: false })
  cy.get('body').trigger('keypress', { keyCode: 87, release: false })
  cy.wait(50)
}
cy.get('body').trigger('keyup', { keyCode: 87, release: false })

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

С уважением.

Другие вопросы по теме