Clipboard API позволяет взаимодействовать с буфером обмена браузера: считывать, копировать и вставлять текстовые данные. В контексте автоматизированного тестирования на Cypress работа с буфером обмена часто используется для проверки функционала копирования, вставки и генерации текстовых данных пользователем.
Чтение данных из буфера обмена Для получения
данных из буфера обмена используется метод
navigator.clipboard.readText(). Он возвращает
Promise с текстом, который можно использовать для
дальнейших проверок:
cy.window().then((win) => {
win.navigator.clipboard.readText().then((text) => {
expect(text).to.equal('Текст для проверки');
});
});
Важный момент: доступ к буферу обмена возможен только в контексте действия пользователя (например, после клика), иначе браузер заблокирует операцию из соображений безопасности.
Запись данных в буфер обмена Метод
navigator.clipboard.writeText(text) позволяет программно
поместить текст в буфер обмена:
cy.window().then((win) => {
win.navigator.clipboard.writeText('Скопированный текст');
});
После выполнения операции можно проверить корректность вставки с
помощью команды cy.get().invoke('val') или
аналогичных.
Cypress не предоставляет встроенных команд для работы с буфером
обмена, поэтому взаимодействие происходит через cy.window()
и вызовы методов navigator.clipboard. Для упрощения тестов
часто создаются кастомные команды:
Cypress.Commands.add('copyToClipboard', (text) => {
cy.window().then((win) => {
return win.navigator.clipboard.writeText(text);
});
});
Cypress.Commands.add('readFromClipboard', () => {
return cy.window().then((win) => {
return win.navigator.clipboard.readText();
});
});
Использование кастомных команд делает тесты более читаемыми и удобными:
cy.copyToClipboard('Тестовый текст');
cy.readFromClipboard().then((text) => {
expect(text).to.equal('Тестовый текст');
});
В реальных приложениях пользователи копируют текст с помощью сочетания клавиш или контекстного меню. Cypress позволяет эмулировать такие действия:
Копирование через комбинацию клавиш
cy.get('#inputField').type('Тестовый текст{selectall}{ctrl}c');
cy.readFromClipboard().then((text) => {
expect(text).to.equal('Тестовый текст');
});
Особенности:
{ctrl}c имитирует Ctrl+C (на Mac —
{cmd}c);{selectall} выделяет весь текст в поле.Копирование через кнопки
Часто на сайтах есть кнопки “Скопировать”. Cypress позволяет кликнуть на такую кнопку и проверить буфер обмена:
cy.get('#copyButton').click();
cy.readFromClipboard().should('eq', 'Данные для копирования');
Это особенно важно для тестирования функционала генерации ссылок, кодов или сообщений.
Отказ в доступе При попытке прочитать или
записать буфер обмена без взаимодействия пользователя методы могут
выбросить ошибку. Рекомендуется оборачивать вызовы в блоки
then или использовать catch:
cy.window().then((win) => {
return win.navigator.clipboard.readText().catch(() => '');
}).then((text) => {
expect(text).to.not.be.empty;
});Поддержка браузеров Clipboard API поддерживается в современных версиях Chrome, Edge, Firefox и Safari. В тестах Cypress следует учитывать потенциальные ограничения в старых версиях браузеров или при запуске в headless режиме.
describe('Clipboard API тестирование', () => {
it('копирование через кнопку', () => {
cy.visit('/clipboard-demo');
cy.get('#copyButton').click();
cy.readFromClipboard().should('eq', 'Текст для копирования');
});
it('вставка из буфера', () => {
cy.copyToClipboard('Вставляемый текст');
cy.get('#inputField').focus().then(() => {
cy.window().then((win) => {
win.navigator.clipboard.readText().then((text) => {
cy.get('#inputField').type(text);
cy.get('#inputField').should('have.value', 'Вставляемый текст');
});
});
});
});
});
Такой подход позволяет полностью покрыть сценарии копирования и вставки, включая взаимодействие с интерфейсом и проверку состояния данных.