Skip to content

Commit 3d8c670

Browse files
author
Ricardo Santos
committed
🎉 santosqa.com | Cypress Web Start
0 parents  commit 3d8c670

29 files changed

+4042
-0
lines changed

.DS_Store

6 KB
Binary file not shown.

.editorconfig

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
root = true
2+
3+
[*]
4+
end_of_line = lf
5+
insert_final_newline = true
6+
7+
[*.{js,json,yml}]
8+
charset = utf-8
9+
indent_style = space
10+
indent_size = 2

.gitattributes

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/.yarn/** linguist-vendored
2+
/.yarn/releases/* binary
3+
/.yarn/plugins/**/* binary
4+
/.pnp.* binary linguist-generated

.gitignore

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
.yarn
2+
!.yarn/patches
3+
!.yarn/plugins
4+
!.yarn/releases
5+
!.yarn/sdks
6+
!.yarn/versions
7+
8+
node_modules
9+
# Swap the comments on the following lines if you wish to use zero-installs
10+
# In that case, don't forget to run `yarn config set enableGlobalCache false`!
11+
# Documentation here: https://yarnpkg.com/features/caching#zero-installs
12+
13+
#!.yarn/cache
14+
.pnp.*
15+
16+
# adicionar pasta node modules e tudo que estiver dentro dela
17+
18+
env.js

.yarnrc.yml

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
nodeLinker: node-modules

README.md

+124
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
2+
<p align="center">
3+
<a href="https://santosqa.github.io/" target="_blank" rel="noopener noreferrer">
4+
<picture>
5+
<source media="(prefers-color-scheme: dark)" srcset="./assets/cypress-logo-dark.png">
6+
<source media="(prefers-color-scheme: light)" srcset="./assets/cypress-logo-dark.png">
7+
<img alt="Cypress Logo" src="./assets/cypress-logo-dark.png">
8+
</picture>
9+
</a>
10+
</p>
11+
12+
---
13+
14+
15+
[![Link Bio](https://img.shields.io/badge/Link%20Bio-59d959?style=for-the-badge&logo=about.me&logoColor=white)](https://santosqa.github.io) [![About](https://img.shields.io/badge/About.me-993399?style=for-the-badge&logo=about.me&logoColor=white)](https://about.me/santosqa) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=for-the-badge&logo=github&logoColor=white)](https://github.com/santosqa) [![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/santosqa) [![Instagram](https://img.shields.io/badge/instagram-%23E4405F.svg?&style=for-the-badge&logo=instagram&logoColor=white)](https://www.instagram.com/santosqa_/) [![Santos QA](https://img.shields.io/badge/WWW-SantosQA.com-BD93F9?style=for-the-badge&logo=world&logoColor=white)](https://santosqa.com/) [![Apartamento Vista Mar](https://img.shields.io/badge/WWW-ApartamentoVistaMar.com-FFB86C?style=for-the-badge&logo=sun&logoColor=white)](https://www.apartamentovistamar.com/)
16+
17+
18+
---
19+
20+
21+
# 💻 Cypress WEB Start
22+
23+
24+
O Cypress é uma ferramenta moderna de automação para testes de aplicações web. Diferente de outras ferramentas de testes tradicionais, o Cypress é executado no mesmo ciclo de execução da aplicação, o que permite que você escreva, execute e depure seus testes diretamente no navegador. Ele é ideal para testes de integração, funcionalidade e interface de usuário, oferecendo uma experiência rápida e interativa.
25+
26+
Com Cypress, é possível realizar testes end-to-end de forma eficiente e simples, validando o comportamento da aplicação de ponta a ponta, com foco na interação com os elementos presentes na maioria das páginas web. Além disso, a ferramenta fornece uma série de recursos como captura de telas, gravação de vídeos, depuração em tempo real e relatórios de testes, tornando o processo de automação e validação mais acessível.
27+
28+
## Benefícios do Cypress:
29+
**Desempenho Rápido:** Execução instantânea de testes, sem a necessidade de esperar por longos tempos de execução.
30+
**Depuração Simples:** Ferramentas de depuração e exibição de comandos diretamente no navegador.
31+
**Testes em Tempo Real:** Visualização do comportamento da aplicação enquanto os testes estão sendo executados.
32+
**Facilidade de Uso:** Sintaxe simples e APIs intuitivas para escrever testes, ideal para iniciantes e especialistas.
33+
**Documentação Extensa:** A documentação oficial oferece exemplos e guias para facilitar o aprendizado.
34+
35+
<div style="background-color: #ffd9c9; padding: 10px; border-radius: 5px;" role="alert" aria-live="assertive">
36+
<strong>⚠️ Atenção!</strong><br>
37+
<p>As URLs e credenciais usadas neste projeto são de propriedade exclusiva do @papitodev e dos alunos da formação Cypress Skills. <em>Não utilize-as sem autorização.</em></p>
38+
</div></br>
39+
40+
[![Cursos SantosQA](https://img.shields.io/badge/cypress-santosqa-4A7BFF?style=for-the-badge&logo=cypress&logoColor=white)](https://www.santosqa.com/top/) [![Repositorio PapitoDev](https://img.shields.io/badge/GitHub-papitoDEV-DC143C?style=for-the-badge&logo=github&logoColor=white)](https://github.com/papitodev/) [![Cypress Skills](https://img.shields.io/badge/cypress_Skills-Fernando_papito-32CD32?style=for-the-badge&logo=cypress&logoColor=white)](https://cyskills.com.br/)
41+
42+
43+
<div style="background-color: #DDA0DD; padding: 10px; border-radius: 5px;" role="note" aria-live="polite">
44+
<p>💡 Este repositório é o seu ponto de partida para automatizar testes em páginas web com Cypress. Crie scripts poderosos, escaláveis e prontos para dominar qualquer aplicação! 🚀💻</p>
45+
<p>⚡ Comece sua jornada de automação e leve seus testes para o próximo nível. O futuro dos testes está em suas mãos. Vamos juntos nesse desafio! 💪</p>
46+
</div>
47+
48+
49+
50+
----------------------
51+
## Clonar o projeto
52+
53+
` git clone https://github.com/santosqa/cypress-web-start.git `
54+
` npm install `
55+
` yarn add [email protected] -D `
56+
57+
----------------------
58+
59+
## Comandos de execução
60+
- Abrir interface gráfica Cypress: ``` yarn cypress open ```
61+
- Executar todos testes via terminal: ``` yarn cypress run ```
62+
63+
----------------------
64+
## Links Úteis
65+
66+
- yarn: https://yarnpkg.com/
67+
- package cypress yarn: https://yarnpkg.com/package?q=cypress&name=cypress
68+
- github cypress: https://github.com/cypress-io/cypress
69+
70+
71+
72+
----------------------
73+
74+
## instalação completa:
75+
76+
- Node.js
77+
- $ pm install --global yarn -2
78+
- verifique que o yarn está instalado: $ yarn --version
79+
- no mac execute o comando para garantir que esteva atualizado o arquivo: $ source ~/.zshrc
80+
81+
- Iniciar o projeto: $ yarn init -2
82+
- Instalar cypress: $ yarn add [email protected] -D
83+
( o argumento -D, indica que o pacote será adicionado como uma dependência de desenvolvimento no projeto.Em resumo, adiciona o Cypress como uma dependência que será usada apenas no ambiente de desenvolvimento, sem ser incluída no ambiente de produção.)
84+
- abrir o cypress: $ yarn cypress open
85+
86+
---
87+
88+
## DOC Cypress
89+
- Viewport: https://docs.cypress.io/api/commands/viewport
90+
- Hooks BeforeEach: https://docs.cypress.io/guides/core-concepts/writing-and-organizing-tests#Hooks
91+
92+
93+
----
94+
95+
96+
97+
## Dicas
98+
99+
<div style="background-color: #E6E6FA; padding: 10px; border-radius: 5px;" role="alert" aria-live="assertive">
100+
<strong>🔥 1. Uso de XPATH!</strong>
101+
<p>A * Embora o Cypress não tenha suporte nativo para uso de XPath, é possível alcançar o mesmo objetivo de maneira organizada e nativa sem precisar importar plugins como "cypress-xpath". </br>
102+
* Este exemplo demonstra como validar a mensagem de alerta para o campo obrigatório "Nome Completo".
103+
104+
* XPath equivalente:
105+
"//label[text()='Nome Completo']/.//div[contains(@class, 'alert-msg')]"
106+
107+
* Implementação nativa com Cypress sem o uso do XPATH:
108+
109+
cy.contains('label', 'Nome Completo') // Localiza o rótulo com o texto "Nome Completo"
110+
.parent() // Navega para o elemento pai do rótulo
111+
.find('.alert-msg') // Busca o elemento com a classe 'alert-msg'
112+
.should('be.visible') // Garante que o alerta está visível
113+
.and('have.text', 'O campo nome é obrigatório.'); // Valida o texto do alerta. Use .have.text quando o objetivo é verificar o texto exato e completo de um elemento.
114+
115+
</em></p>
116+
</div></br>
117+
118+
119+
120+
#
121+
122+
---
123+
124+
[Ricardo Santos QA](https://github.com/santosqa) 👋🏼

assets/cypress-logo-dark.png

17.3 KB
Loading

cypress.config.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const { defineConfig } = require("cypress");
2+
const env = require('./env'); // Ajuste conforme a estrutura do projeto
3+
4+
module.exports = defineConfig({
5+
e2e: {
6+
setupNodeEvents(on, config) {
7+
// Implementação de eventos Node
8+
},
9+
baseUrl: env.baseUrl, // Usa o baseUrl do env.js
10+
viewportWidth: 1920,
11+
viewportHeight: 1080,
12+
},
13+
});
14+
15+

cypress/e2e/cep.cy.js

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
describe('CEP', () => {
2+
beforeEach(() => {
3+
cy.goHome()
4+
cy.sucessLogin()
5+
cy.goTo('/cep', 'CEP (API dos Correios)')
6+
7+
})
8+
9+
it('Deve efetuar a consulta do CEP 04534011 com api dos correios retornando com sucesso', () => {
10+
cy.get('input[name="cep"]').type('04534011')
11+
cy.contains('button', 'Cadastrar').click()
12+
13+
cy.get('input[name="logradouro"]', {timeout: 6000})
14+
.should('have.value', 'Rua Joaquim Floriano')
15+
16+
cy.get('input[name="cidade"]')
17+
.should('have.value', 'São Paulo')
18+
19+
cy.get('input[name="estado"]')
20+
.should('have.value', 'SP')
21+
22+
} )
23+
24+
it.only('Deve efetuar a consulta na rota Mockada', () => {
25+
26+
const massaMock = {
27+
cep: '11706170',
28+
logradouro: 'Rua São João',
29+
localidade: 'Praia Grande',
30+
uf: 'SP'
31+
}
32+
33+
cy.intercept('GET', `https://viacep.com.br/ws/${massaMock.cep}/json/`, {
34+
statusCode: 200,
35+
body: massaMock
36+
});
37+
38+
cy.get('input[name="cep"]').type(massaMock.cep);
39+
cy.contains('button', 'Cadastrar').click()
40+
41+
cy.get('input[name="logradouro"]', {timeout: 6000})
42+
.should('have.value', massaMock.logradouro)
43+
44+
cy.get('input[name="cidade"]')
45+
.should('have.value', massaMock.localidade)
46+
47+
cy.get('input[name="estado"]')
48+
.should('have.value', massaMock.uf)
49+
50+
} )
51+
52+
})

cypress/e2e/checkbox.cy.js

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
describe('Checkbox', () => {
2+
beforeEach(() => {
3+
cy.goHome()
4+
cy.sucessLogin()
5+
cy.goTo('/checkbox', 'Checkbox')
6+
})
7+
8+
it('Deve selecionar checkbox das linguagens que usam Node.js', () => {
9+
cy.get('label[for="javascript"]')
10+
.click()
11+
12+
cy.get('label[for="typescript"]')
13+
.click()
14+
})
15+
16+
17+
it('Deve selecionar todos os checkbox', () => {
18+
19+
const langs = ['javascript', 'python', 'rust', 'go', 'typescript']
20+
21+
langs.forEach(lang => {
22+
cy.get(`label[for=${lang}]`).click()
23+
})
24+
25+
})
26+
27+
28+
})

cypress/e2e/datepicker.cy.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
describe('Date Picker', () => {
2+
beforeEach(() => {
3+
cy.goHome()
4+
cy.sucessLogin()
5+
cy.goTo('/date-picker', 'Date Picker')
6+
7+
})
8+
9+
it('Deve selecionar a data do natal.', () => {
10+
cy.get('input[placeholder="Escolha uma data"][readonly]')
11+
.click()
12+
13+
cy.get('select[aria-label="Month"]')
14+
.select('Dezembro')
15+
16+
cy.get('input[aria-label="Year"]')
17+
.type('2024')
18+
19+
cy.get('span[aria-label="Dezembro 25, 2024"]')
20+
.click()
21+
})
22+
23+
})

cypress/e2e/dragandrop.cy.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
describe('Drag and Drop', () => {
2+
beforeEach(() => {
3+
cy.goHome()
4+
cy.sucessLogin()
5+
cy.goTo('/tasks', 'Task Board')
6+
7+
})
8+
9+
it('Deve arrastar o item da coluna ToDo e soltar na coluna Done', () => {
10+
const task = 'Desenho do Wireframe'
11+
12+
const dataTransfer = new DataTransfer()
13+
14+
cy.contains('div[draggable="true"]', task)
15+
.trigger('dragstart', { dataTransfer })
16+
17+
cy.contains('h4', 'Done')
18+
.parent()
19+
.trigger('drop', { dataTransfer })
20+
21+
//valida que nao tem mais a tarefa ma coluna ToDo
22+
cy.contains('h4', 'ToDo')
23+
.parent()
24+
.find('div[draggable="true"]')
25+
.each(($el) => {
26+
cy.wrap($el).should('not.contain.text', task);
27+
});
28+
29+
//valida que tem a tarefa na coluna Done
30+
cy.contains('h4', 'Done')
31+
.parent()
32+
.contains('div[draggable="true"]', task)
33+
.should('be.visible')
34+
})
35+
36+
})

cypress/e2e/iframe.cy.js

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
describe('IFrame', () => {
2+
beforeEach(() => {
3+
cy.goHome()
4+
cy.sucessLogin()
5+
cy.goTo('/iframe', 'IFrame')
6+
7+
})
8+
9+
it('Deve preencher os campos em uma página com iFrame', () => {
10+
cy.get('[data-cy="iframe-inputs"]')
11+
.then(($iframe) => {
12+
const body = $iframe.contents().find('body')
13+
14+
cy.wrap(body)
15+
.find('#fullname')
16+
.type('Ricardo Santos QA')
17+
18+
cy.wrap(body)
19+
.find('input[name="email"]')
20+
21+
22+
cy.wrap(body)
23+
.find('input[placeholder="12345"]')
24+
.type('123456')
25+
26+
cy.wrap(body)
27+
.find('[data-cy="date"]')
28+
.type('2024-01-01')
29+
})
30+
31+
})
32+
33+
})

cypress/e2e/inputs.cy.js

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
describe('Inputs Fields', () => {
2+
beforeEach(() => {
3+
cy.goHome()
4+
cy.sucessLogin()
5+
cy.goTo('/input-fields', 'Input Fields')
6+
7+
})
8+
9+
it('Deve preencher formulário com sucesso', () => {
10+
cy.get('#fullname').type('Ricardo Santos QA')
11+
cy.get('input[name="email"]').type('[email protected]')
12+
cy.get('input[placeholder="12345"]').type('123456')
13+
cy.get('[data-cy="date"]').type('2024-01-01')
14+
})
15+
16+
17+
})
18+

0 commit comments

Comments
 (0)