Conversor de cURL para Cypress e Playwright

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.

cy.request()

Como usar

  1. 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.
  2. Cole no campo e clique em Converter. A sintaxe (bash/zsh ou cmd) é detectada sozinha; se precisar, escolha no seletor.
  3. Ajuste o status esperado quando quiser testar um erro (400, 401, 404…).
  4. 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 curlCypressPlaywrightfetch()
-X, -I, -G e método implícitomethodrequest.get/post/... ou request.fetchmethod
-H, -A, -e, -bheadersheadersheaders
-d com JSON, --jsonobjeto em bodyobjeto em dataJSON.stringify(...)
-d a=1 -d b=2, --data-urlencodeform: true + bodyformURLSearchParams
-G com dadosqsparamsquery na URL
-F (multipart)FormDatamultipartFormData
-u usuário:senhaauthcabeçalho Authorization: Basiccabeçalho Authorization: Basic
-kcomentário (já não verifica TLS)ignoreHTTPSErrors: trueaviso
--max-timetimeouttimeoutAbortSignal.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 '{...}' envia application/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 saem sec-ch-*, sec-fetch-* e priority, 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á inclui failOnStatusCode: false.

Limitações

  • Arquivos (-d @arquivo, -F campo=@arquivo, -T) não são lidos: viram comentários TODO no 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, use followRedirect: false (Cypress) ou maxRedirects: 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 await no nível do arquivo, que no Node exige módulo ES (.mjs). No navegador, o fetch não envia Cookie nem User-Agent definidos à 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

Referências