Aprenda como ler informações salvas na janela do navegador, tal como o que é salvo na área de transferência

Imagine uma aplicação simples, a qual possui somente um input do tipo texto, com um valor padrão (por exemplo, Olá mundo) e um botão chamado copiar para a área de transferência, o qual quando clicado, copia o texto do input para tal área, como o nome sugere.

Quando clicado logo que a aplicação é visitada, o texto copiado é Olá mundo.

Porém, quando tal texto é apagado, outro texto é digitado e então o botão é clicado, o novo texto é copiado.

E aí você se pergunta.

E como testar estes cenários com Cypress?

Que bom que perguntou, pois é isso que vou te mostrar nesta “pitada de Cypress”.

O código da aplicação se resume ao seguinte arquivo index.html.

<!DOCTYPE html>
<html>
  <head>
    <title>Copy to clipboard example page</title>
    <style>
      * {
        font-family: sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Copy to clipboard sample</h1>
    <input type="text" value="Hello World" id="copy-to-clipboard-input-field">
    <button onclick="copyToClipboard()">Copy to clipboard</button>
    <script>
      function copyToClipboard() {
        const copyText = document.getElementById("copy-to-clipboard-input-field")

        copyText.select() // Select the text field
        copyText.setSelectionRange(0, 99999) // For mobile devices

        // Copy the text inside the text field
        navigator.clipboard.writeText(copyText.value)
      }
    </script>
  </body>
</html>

E o código do teste ao seguinte arquivo cypress/e2e/copyToClipboard.cy.js.

it('copies input field text to the clipboard', () => {
  cy.visit('./index.html')

  cy.contains('button', 'Copy to clipboard')
    .focus()
    .click()

  cy.assertValueCopiedToClipboard('Hello World')

  cy.get('#copy-to-clipboard-input-field')
    .clear()
    .type('Foo bar baz')

  cy.contains('button', 'Copy to clipboard')
    .focus()
    .click()

  cy.assertValueCopiedToClipboard('Foo bar baz')
})

Cypress.Commands.add('assertValueCopiedToClipboard', value => {
  cy.window().then(win => {
    win.navigator.clipboard.readText().then(text => {
      expect(text).to.eq(value)
    })
  })
})

No teste, primeiro visito a aplicação em teste, ou seja, o arquivo index.html.

Então encontro o botão com o texto Copy to clipboard (copiar para a área de transferência em inglês), foco e clico nele.

Quando o botão é clicado, o texto padrão do input do tipo texto deve ser copiado para a área de transferência, e portanto, faço a verificação de que o valor correto foi copiado, por meio de um comando customizado, o qual explicarei logo mais.

Depois, limpo o input, digito um valor diferente, foco e clico novamente no botão.

Por fim, verifico que o novo valor agora foi copiado para a área de transferência, substituindo o valor anterior.

Agora deixa eu te explicar em detalhes o comando customizado que verifica que o valor foi corretamente copiado para a área de transferência.

O comando recebe como argumento o valor a ser comparado (value), ou seja, o resultado esperado.

Em sua implementação, executo o comando cy.window(), no qual encadeio o comando .then(), passando à ele uma função de callback, a qual recebe como argumento a janela do navegador (win).

Com acesso a janela (win), acesso a propriedade navigator, a partir dela acesso a propriedade clipboard, e então uso a função readText() para ler o texto copiado ao clipboard, onde encadeio outro .then(), e neste caso, a função de callback recebe como argumento o texto (text) contido na área de transferência, me possibilitando realizar a verificação de que o texto (text) é igual ao valor esperado (value).

E é assim que consigo testar com Cypress o valor copiado para a área de transferência do navegador.

Veja o teste executando no gif abaixo.

ezgif.com-gif-maker

E veja também o código completo no GitHub.

Aproveite pra deixar uma estrela!


Referência: https://www.w3schools.com/howto/howto_js_copy_clipboard.asp.


Gostou dessa “pitada de Cypress”?

Deixa um comentário.


Ficou curioso(a) e quer aprender mais sobre automação de testes com Cypress? Conheça os cursos da Escola TAT.


👋  Até a próxima e bons testes!


Este conteúdo foi traduzido para inglês e pode ser encontrado no DEV Community.

4 comentários em “Testando a cópia para a área de transferência com Cypress

  1. Muito boa dica, mas está retornando um erro de “NotAllowedError: Document is not focused.”. Você sabe como contorná-lo?

    1. Realmente isso acontece ao rodar no Chrome, no Electron não percebi ocorrer.
      Corrigi focando no botão antes do clique.

      cy.contains(‘button’, ‘Copy to clipboard’)
      .focus()
      .click()

Deixe um comentário