← Voltar para artigos
CI · Diagnóstico

Passa localmente, falha no CI: investigando flakiness com Playwright

Um caso real de diagnóstico de falhas em CI, hipóteses descartadas e investigação da causa raiz.

O cenário

O Playwright Automation Lab possui testes de API e UI executados em Chromium, Firefox e WebKit. O cenário de Web Tables realiza um CRUD: cria um registro, localiza a linha pelo e-mail, edita o departamento e exclui o registro.

Localmente, o fluxo funcionava. No GitHub Actions, porém, a etapa de edição falhava de forma consistente nos três projetos de browser.

O ponto importante: quando a mesma falha aparece em vários engines no mesmo ambiente, vale investigar primeiro o que esse ambiente tem em comum antes de tratar cada browser como um problema independente.

O erro não estava no locator

O Playwright encontrava o botão de edição. O elemento estava visível, habilitado e estável. Ainda assim, o clique não era concluído porque outro elemento da página interceptava os eventos de ponteiro.

Isso muda completamente o diagnóstico: não era um problema de encontrar o elemento nem simplesmente de “esperar mais”. O teste estava tentando interagir com o alvo correto, mas a geometria da página no CI permitia que uma área lateral do DemoQA ficasse sobre a região da tabela.

Hipóteses precisam ser testadas, não assumidas

Uma hipótese razoável era diferença de viewport. Fixar dimensões explícitas poderia tornar o layout mais próximo do ambiente local. A hipótese foi testada, mas a falha continuou. Isso foi útil: uma tentativa que não resolve o problema também produz informação e reduz o espaço de busca.

O próximo passo foi voltar às evidências da execução — logs, screenshots e trace — em vez de continuar alterando configuração global.

A causa raiz

O problema estava ligado a elementos de publicidade e ao container estrutural lateral do DemoQA. No CI, essa região podia interceptar os eventos destinados aos botões da Web Table.

Como a publicidade não fazia parte do comportamento que o cenário pretendia validar, a solução foi neutralizar especificamente a interferência antes de executar as ações da tabela:

private async disableDemoQaInterference() {
  await this.page.addStyleTag({
    content: `
      #fixedban,
      #RightSide_Advertisement,
      [id^="Ad.Plus-"],
      [id^="google_ads_"],
      iframe[title="3rd party ad content"],
      iframe[aria-label="Advertisement"] {
        pointer-events: none !important;
      }

      .col-12.mt-4.col-md-3.col-xl-3 {
        pointer-events: none !important;
      }
    `,
  });
}

Por que não usar force: true?

force: true poderia fazer o clique acontecer, mas reduziria o valor da verificação de actionability do Playwright. Se a aplicação real estivesse cobrindo um botão por erro de layout, forçar a interação poderia transformar um defeito legítimo em teste verde.

Neste laboratório, a interferência vinha de uma área externa ao comportamento testado. Por isso, o tratamento ficou explícito e localizado no Page Object do DemoQA, mantendo os cliques normais no fluxo funcional.

O que esse caso ensina

  • “Passa localmente” não prova estabilidade. O CI adiciona outro ambiente de renderização e execução.
  • Leia a mensagem de actionability. “Intercepts pointer events” aponta para uma classe de problema diferente de timeout de carregamento.
  • Não transforme timeout em solução padrão. Mais tempo não corrige sobreposição de elementos.
  • Teste uma hipótese por vez. Viewport foi uma hipótese válida; o fato de não resolver ajudou o diagnóstico.
  • Use Trace, logs e screenshots como instrumentos de engenharia. Eles existem para reduzir especulação.
  • Diferencie AUT, ambiente e teste. A correção correta depende de saber qual camada está produzindo a falha.

Resultado

Com a interferência externa neutralizada, a suíte voltou a executar de forma consistente no pipeline: seis cenários distribuídos pelos três projetos do Playwright, totalizando 18 execuções.

O aprendizado mais relevante não foi a regra de CSS. Foi o processo: observar a falha, classificar o sintoma, testar hipóteses, usar evidências e aplicar a menor intervenção compatível com a causa encontrada.

Aplicação prática

Veja este conceito em um projeto real.

Este artigo está relacionado ao Playwright Automation Lab, onde o conceito aparece aplicado em código.

Conhecer o projeto
Ver código no GitHub Todos os artigos
Continue estudando

Artigos relacionados

← AnteriorQuando o teste Playwright falha: diagnosticando locators e storageStatePróximo →Esperar tempo ou esperar estado?