Cole um comando cURL, inclusive o “Copy as cURL” do DevTools em bash ou no cmd do Windows, e receba a mesma requisição escrita como cy.request() do Cypress, teste de API do Playwright e fetch(). O corpo JSON vira objeto literal formatado, tokens e cookies viram variáveis de ambiente e as opções que não têm equivalente aparecem como aviso. O comando é só analisado no seu navegador: nada é executado nem enviado.
Exemplos:
O comando é só analisado, nunca executado, e não sai do seu navegador. Mesmo assim, prefira colar tokens de ambientes de teste.
Como usar
- No DevTools (aba Network), clique com o botão direito na requisição e escolha Copy → Copy as cURL (bash) ou (cmd). Também vale um comando escrito à mão ou tirado da documentação da API.
- Cole no campo e clique em Converter. A sintaxe (bash/zsh ou cmd) é detectada sozinha; se precisar, escolha no seletor.
- Ajuste o status esperado quando quiser testar um erro (400, 401, 404…).
- Troque de aba entre Cypress, Playwright e fetch() e use o botão de copiar de cada uma.
Exemplo com a API do Lab
O Lab de API da AppsQuality aceita login com usuários fictícios, então dá para testar o código gerado de verdade. Este comando:
curl -X POST 'https://appsquality.com.br/wp-json/aq-lab/v1/auth/login' \
-H 'Content-Type: application/json' \
-d '{"username":"standard_user","password":"qa@12345"}'
vira, no Cypress:
cy.request({
method: 'POST',
url: 'https://appsquality.com.br/wp-json/aq-lab/v1/auth/login',
headers: {
'Content-Type': 'application/json',
},
body: {
username: 'standard_user',
password: 'qa@12345',
},
}).then((response) => {
expect(response.status).to.eq(200);
});
No Playwright, a mesma chamada fica dentro de um test() com request.post(url, { headers, data }) e expect(response.status()).toBe(200). O aviso sobre o campo password é proposital: aqui a senha é pública, mas numa API real não deveria ficar no código. Troque o usuário por locked_user e o status esperado por 423 para gerar um teste negativo.
O que é convertido
| Opção do curl | Cypress | Playwright | fetch() |
|---|---|---|---|
-X, -I, -G e método implícito | method | request.get/post/... ou request.fetch | method |
-H, -A, -e, -b | headers | headers | headers |
-d com JSON, --json | objeto em body | objeto em data | JSON.stringify(...) |
-d a=1 -d b=2, --data-urlencode | form: true + body | form | URLSearchParams |
-G com dados | qs | params | query na URL |
-F (multipart) | FormData | multipart | FormData |
-u usuário:senha | auth | cabeçalho Authorization: Basic | cabeçalho Authorization: Basic |
-k | comentário (já não verifica TLS) | ignoreHTTPSErrors: true | aviso |
--max-time | timeout | timeout | AbortSignal.timeout |
Também são reconhecidos --data-raw, --data-binary, --url, --oauth2-bearer, -L e --compressed (estes dois já são o comportamento padrão das três ferramentas). Opções que só mudam a saída do curl, como -s, -v, -o e -w, são listadas como ignoradas.
Como funciona
A ferramenta tem um tokenizador de shell próprio, sem executar nada. No modo bash/zsh ele entende aspas simples (texto literal), aspas duplas (com escapes de \", \\ e \$), o formato $'...' com \n, \t, \xHH e \uHHHH, barras invertidas fora de aspas e a continuação de linha com \. No modo cmd, aplica primeiro as regras do ^ do Prompt de Comando (incluindo a continuação com ^ no fim da linha) e depois as regras de aspas e \" que o Windows usa para separar argumentos, que é o formato do “Copy as cURL (cmd)” do Chrome e do Edge.
Depois, os argumentos são lidos como o curl faz: opções agrupadas (-sSL) ou com valor colado (-XPOST), vários -d unidos por &, vários --json concatenados e --data-urlencode em UTF-8. Variáveis como $TOKEN não são expandidas. O método segue a regra do curl: POST quando há dados, a menos que exista -X, -I ou -G. Essas regras foram conferidas no manual oficial do curl.
Segredos: Cypress.env, cy.env e process.env
Com a opção de mascaramento ligada, os valores de Authorization, Cookie, cabeçalhos com “token”, “secret” ou “api-key” e o par de -u são substituídos por variáveis como API_TOKEN, COOKIE e API_USER/API_PASS. No Playwright e no fetch elas viram process.env.NOME. No Cypress há duas opções: cy.env([...]), que a documentação do Cypress indica a partir da versão 15.10, e Cypress.env('NOME'), que foi descontinuado na 15.10 e removido na 16.0, segundo a documentação do cy.env(). Use o segundo só em projetos com versão anterior.
Senhas e tokens dentro do corpo, como o campo password do exemplo, são apontados nos avisos mas não substituídos, porque muitas vezes são massa de teste. A ferramenta também avisa quando a URL carrega token ou api_key na query string.
Uso em QA
- Reproduzir em teste automatizado um bug encontrado no navegador: copie a requisição que falhou no DevTools e transforme em caso de regressão.
- Montar rapidamente o caminho feliz e os negativos de um endpoint (mude o corpo e o status esperado) seguindo o contrato da API. O guia APIs testáveis: contrato e erros mostra o que vale verificar além do status.
- Fazer login por API no início dos testes de interface, em vez de passar pela tela de login toda vez.
- Treinar no Lab da AppsQuality, que tem usuários com comportamentos diferentes, como conta bloqueada, lentidão e erros intermitentes.
Erros comuns
- Comando cortado ao copiar: aspas abertas sem fechamento geram erro com a posição exata.
- JSON sem Content-Type:
curl -d '{...}'enviaapplication/x-www-form-urlencoded. O código gerado manda como JSON e avisa, porque isso pode mudar o resultado. - Content-Length e cabeçalhos do navegador:
Content-Lengthé sempre removido (é calculado automaticamente) e, por padrão, também saemsec-ch-*,sec-fetch-*epriority, que só poluem o teste. - Esperar 4xx no Cypress: o
cy.request()falha em status fora de 2xx/3xx. Com status esperado de erro, o código já incluifailOnStatusCode: false.
Limitações
- Arquivos (
-d @arquivo,-F campo=@arquivo,-T) não são lidos: viram comentáriosTODOno código. - Sem
-L, o curl não segue redirecionamentos, mas Cypress, Playwright e fetch seguem por padrão. Se o teste é sobre o redirecionamento, usefollowRedirect: false(Cypress) oumaxRedirects: 0(Playwright). - PowerShell (
Invoke-WebRequest), proxies, certificados de cliente, cookies lidos de arquivo e o “globbing” de URLs com{}e[]não são convertidos. - Só um comando e uma URL por vez. O que vem depois de
|,;ou&&é ignorado. - O código do fetch usa
awaitno nível do arquivo, que no Node exige módulo ES (.mjs). No navegador, o fetch não enviaCookienemUser-Agentdefinidos à mão.
Perguntas frequentes
Funciona com o “Copy as cURL” do Chrome no Windows?
Sim. Tanto a versão (bash) quanto a (cmd), com os ^ de escape e de quebra de linha. Se a detecção automática errar, escolha a sintaxe no seletor.
Por que a saída do Playwright não tem httpCredentials?
Porque essa opção vale para o contexto inteiro, e não para uma requisição. O código monta o cabeçalho Authorization: Basic com Buffer, que funciona em qualquer teste.
O meu token vai para algum servidor?
Não. A conversão roda no JavaScript desta página, sem chamadas de rede. Mesmo assim, prefira tokens de ambientes de teste e revogue os que vazarem.
Ferramentas relacionadas
- Formatador e validador de JSON: confira a resposta da API.
- Decodificador de JWT: veja o conteúdo e a validade do token Bearer.
- Codificador e decodificador Base64: leia um cabeçalho
Authorization: Basic. - Gerador de massa de testes: dados fictícios para os corpos das requisições.
