Pular para o conteúdo principal

Depuração

A depuração é significativamente mais difícil quando vários processos geram dezenas de testes em múltiplos navegadores.

Para começar, é extremamente útil limitar o paralelismo definindo maxInstances como 1, e direcionando apenas as especificações e navegadores que precisam ser depurados.

Em wdio.conf:

export const config = {
// ...
maxInstances: 1,
specs: [
'**/myspec.spec.js'
],
capabilities: [{
browserName: 'firefox'
}],
// ...
}

O Comando Debug

Em muitos casos, você pode usar browser.debug() para pausar seu teste e inspecionar o navegador.

Sua interface de linha de comando também mudará para o modo REPL. Este modo permite que você experimente comandos e elementos na página. No modo REPL, você pode acessar o objeto browser—ou as funções $ e $$—como você pode em seus testes.

Ao usar browser.debug(), você provavelmente precisará aumentar o timeout do test runner para evitar que ele falhe o teste por demorar muito. Por exemplo:

Em wdio.conf:

jasmineOpts: {
defaultTimeoutInterval: (24 * 60 * 60 * 1000)
}

Veja timeouts para mais informações sobre como fazer isso usando outros frameworks.

Para prosseguir com os testes após a depuração, no shell use o atalho ^C ou o comando .exit.

Configuração dinâmica

Observe que o wdio.conf.js pode conter Javascript. Como você provavelmente não quer alterar permanentemente seu valor de timeout para 1 dia, muitas vezes pode ser útil alterar essas configurações a partir da linha de comando usando uma variável de ambiente.

Usando esta técnica, você pode alterar dinamicamente a configuração:

const debug = process.env.DEBUG
const defaultCapabilities = ...
const defaultTimeoutInterval = ...
const defaultSpecs = ...

export const config = {
// ...
maxInstances: debug ? 1 : 100,
capabilities: debug ? [{ browserName: 'chrome' }] : defaultCapabilities,
execArgv: debug ? ['--inspect'] : [],
jasmineOpts: {
defaultTimeoutInterval: debug ? (24 * 60 * 60 * 1000) : defaultTimeoutInterval
}
// ...
}

Você pode então prefixar o comando wdio com a flag debug:

$ DEBUG=true npx wdio wdio.conf.js --spec ./tests/e2e/myspec.test.js

...e depurar seu arquivo de especificação com o DevTools!

Depurando com Visual Studio Code (VSCode)

Se você quiser depurar seus testes com pontos de interrupção no VSCode mais recente, você tem duas opções para iniciar o depurador, das quais a opção 1 é o método mais fácil:

  1. anexar automaticamente o depurador
  2. anexar o depurador usando um arquivo de configuração

VSCode Toggle Auto Attach

Você pode anexar automaticamente o depurador seguindo estas etapas no VSCode:

  • Pressione CMD + Shift + P (Linux e Macos) ou CTRL + Shift + P (Windows)
  • Digite "attach" no campo de entrada
  • Selecione "Debug: Toggle Auto Attach"
  • Selecione "Only With Flag"

É isso! Agora, quando você executar seus testes (lembre-se de que precisará da flag --inspect definida em sua configuração, como mostrado anteriormente), ele iniciará automaticamente o depurador e parará no primeiro ponto de interrupção que encontrar.

Arquivo de configuração do VSCode

É possível executar todos ou arquivos de especificação selecionados. As configurações de depuração devem ser adicionadas ao .vscode/launch.json, para depurar a especificação selecionada, adicione a seguinte configuração:

{
"name": "run select spec",
"type": "node",
"request": "launch",
"args": ["wdio.conf.js", "--spec", "${file}"],
"cwd": "${workspaceFolder}",
"autoAttachChildProcesses": true,
"program": "${workspaceRoot}/node_modules/@wdio/cli/bin/wdio.js",
"console": "integratedTerminal",
"skipFiles": [
"${workspaceFolder}/node_modules/**/*.js",
"${workspaceFolder}/lib/**/*.js",
"<node_internals>/**/*.js"
]
},

Para executar todos os arquivos de especificação, remova "--spec", "${file}" de "args"

Exemplo: .vscode/launch.json

Informações adicionais: https://code.visualstudio.com/docs/nodejs/nodejs-debugging

Repl Dinâmico com Atom

Se você é um desenvolvedor do Atom, você pode experimentar o wdio-repl de @kurtharriger, que é um repl dinâmico que permite executar linhas de código individuais no Atom. Assista a este vídeo do YouTube para ver uma demonstração.

Depurando com WebStorm / Intellij

Você pode criar uma configuração de depuração node.js assim: Screenshot from 2021-05-29 17-33-33 Assista a este vídeo do YouTube para obter mais informações sobre como fazer uma configuração.

Depurando testes instáveis

Testes instáveis podem ser realmente difíceis de depurar, então aqui estão algumas dicas sobre como você pode tentar reproduzir localmente aquele resultado instável que obteve em seu CI.

Rede

Para depurar instabilidades relacionadas à rede, use o comando throttleNetwork.

await browser.throttleNetwork('Regular3G')

Velocidade de renderização

Para depurar instabilidades relacionadas à velocidade do dispositivo, use o comando throttleCPU. Isso fará com que suas páginas sejam renderizadas mais lentamente, o que pode ser causado por muitas coisas, como a execução de vários processos em seu CI que podem estar desacelerando seus testes.

await browser.throttleCPU(4)

Velocidade de execução do teste

Se seus testes não parecem ser afetados, é possível que o WebdriverIO seja mais rápido que a atualização do framework frontend / navegador. Isso acontece ao usar asserções síncronas, pois o WebdriverIO não tem chance de repetir essas asserções. Alguns exemplos de código que podem quebrar por causa disso:

expect(elementList.length).toEqual(7) // a lista pode não estar populada no momento da asserção
expect(await elem.getText()).toEqual('this button was clicked 3 times') // o texto pode ainda não estar atualizado no momento da asserção, resultando em um erro ("this button was clicked 2 times" não corresponde ao esperado "this button was clicked 3 times")
expect(await elem.isDisplayed()).toBe(true) // pode ainda não estar exibido

Para resolver este problema, devem ser utilizadas asserções assíncronas. Os exemplos acima ficariam assim:

await expect(elementList).toBeElementsArrayOfSize(7)
await expect(elem).toHaveText('this button was clicked 3 times')
await expect(elem).toBeDisplayed()

Usando essas asserções, o WebdriverIO aguardará automaticamente até que a condição corresponda. Ao afirmar texto, isso significa que o elemento precisa existir e o texto precisa ser igual ao valor esperado. Falamos mais sobre isso em nosso Guia de Melhores Práticas.

Welcome! How can I help?

WebdriverIO AI Copilot