Я хочу имитировать долгое нажатие клавиши обратной кавычки без выбора определенного элемента 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 происходит только один раз и не удерживается.





Когда вы удерживаете клавишу в браузере, на самом деле это заканчивается множеством последующих событий keydown/keypress, за которыми следует keyup, когда вы, наконец, отпускаете клавишу.
Вы можете проверить это поведение, запустив этот код в своем браузере:
['keydown','keypress','keyup'].map(e => {
document.addEventListener(e, (p) => console.info(e, p))
})
Затем, удерживая нажатой клавишу, просмотрите журнал консоли, чтобы узнать, какие события генерируются. В Firefox удержание клавиши A дает:
Итак, чтобы сделать это с 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, чтобы двигаться вперед.
С уважением.