Neste post
  1. TikTok: o seletor de hora que anda de três em três
  2. X: a barra que muda de altura
  3. Meta: o clique que abre uma caixa de diálogo do sistema
  4. O padrão
  5. As três regras que sobraram
  6. 1. Nunca reaproveitar coordenada entre chamadas
  7. 2. Verificar numa chamada separada da ação
  8. 3. Esperar por condição, nunca por tempo
  9. O que isso tem a ver com desenvolver aplicativo
  10. O placar honesto

Depois de resolver os dois bugs do YouTube — contados na parte 1 — a expectativa era de que o resto fosse rotina. Faltavam TikTok, X, Instagram, Facebook, Kwai e Reddit.

Cada plataforma trouxe uma falha nova. E cada falha nova, olhada de perto, era a mesma falha.

TikTok: o seletor de hora que anda de três em três

O agendador do TikTok não aceita hora digitada. É um seletor de rolagem, e ele tem um comportamento que ninguém documenta:

  • clicar na última linha visível da coluna de horas avança +3 horas
  • o valor efetivamente selecionado é o da linha do meio, não o da linha

clicada

  • a posição do dropdown na tela varia conforme o espaço disponível

Ou seja: você clica no "18" e seleciona o "15". Ou o "21". Depende de onde o dropdown resolveu abrir.

O vídeo nº 15 foi agendado para 18:10 em vez de 18:00. O motivo exato: a conferência do resultado tinha sido feita na mesma chamada do clique. A resposta descrevia o estado antes do clique surtir efeito, e a gente leu essa resposta como confirmação.

Verificar e agir na mesma ação é o mesmo erro de ler um valor e usá-lo depois de outra thread ter escrito nele. Só que aqui a outra thread é a interface.

X: a barra que muda de altura

No X, o botão de agendar fica na barra do compositor. A barra muda de altura em três situações:

Estado do compositorPosição do botão
Texto de 1 linhay = 312
Texto de 2 linhasy = 337
Card de preview do site já carregadoy = 625

Três valores diferentes, e o terceiro só aparece alguns segundos depois de o texto ser digitado, quando o X termina de buscar o preview do link. Uma coordenada capturada antes do card carregar aponta para o lugar errado quando o clique acontece.

E não é só isso: a janela se redimensiona sozinha entre uma ação e outra. Nada que dependa de posição absoluta sobrevive a isso.

Meta: o clique que abre uma caixa de diálogo do sistema

O caso mais interessante foi o do editor de vídeo do Meta. O botão visível de enviar arquivo abre a caixa de diálogo nativa do sistema operacional — que está fora do navegador e, portanto, fora do alcance de qualquer automação de página.

A saída não foi clicar melhor. Foi entender o que o botão faz: ele chama click() num <input type="file"> que a própria aplicação cria na hora. Com esse elemento localizado, o arquivo vai direto para ele — sem passar pela caixa de diálogo.

Quando um clique abre uma janela do sistema, a automação de página acabou ali. A resposta não é insistir no clique: é achar o elemento que o clique aciona.

O padrão

Escrito lado a lado, o problema fica óbvio:

PlataformaO que se mexeO que quebra
YouTubeO campo de título cresce ao receber textoO clique na descrição cai dentro do título
TikTokO dropdown abre para cima ou para baixoSeleciona a hora errada, em silêncio
XA barra sobe quando o preview carregaO clique de agendar erra o botão
MetaO elemento de upload nasce na hora do cliqueA caixa do sistema trava tudo
InstagramA grade muda depois do uploadO botão "Avançar" muda de lugar
RedditO editor troca entre markdown e rich textO texto vai para o campo errado

Seis interfaces, seis motivos diferentes, um problema só: entre o instante em que você lê a tela e o instante em que você clica, a tela mudou.

As três regras que sobraram

1. Nunca reaproveitar coordenada entre chamadas

Coordenada é um valor com prazo de validade de milissegundos. Ou se localiza o elemento e se clica nele, ou se lê a posição na mesma ação em que se clica. Guardar (694, 337) para usar no passo seguinte é guardar um ponteiro para memória que já foi liberada.

2. Verificar numa chamada separada da ação

Esta é a regra que mais custou para aprender e a que mais rendeu. Conferir e clicar juntos produz uma leitura do passado. Confirmar, e só então agir. O vídeo nº 15 do TikTok e o nº 16 — que recebeu o nome do arquivo como legenda — foram os dois últimos erros desse tipo; depois da separação, nenhum.

3. Esperar por condição, nunca por tempo

esperar 3 segundos é chute. esperar até o rodapé dizer "Verificações concluídas" é contrato. Toda vez que o processo dependeu de um tempo fixo, falhou em algum vídeo maior ou numa conexão mais lenta.

Vale para todas as plataformas:

  • YouTube: esperar o texto do rodapé mudar
  • TikTok: a primeira tentativa de upload sempre falha com uma proteção

anti-automação; recarregar a página e repetir funciona. É condição, não tempo.

  • X: o seletor de agendamento não aparece na árvore nos primeiros segundos

mesmo com o diálogo já aberto na tela; repetir a busca resolve

O que isso tem a ver com desenvolver aplicativo

Tudo, e é por isso que este post está nos bastidores e não numa gaveta de scripts.

As mesmas três regras descrevem teste de interface, e descrevem o motivo pelo qual teste end-to-end tem fama de instável. Teste que espera por tempo, guarda coordenada e afirma sobre estado que ele não controla é instável por construção — e a culpa cai injustamente na ferramenta.

A versão curta, que serve para os dois casos:

Não afirme nada sobre uma tela que você não acabou de ler. E não leia uma tela na mesma ação em que você a modifica.

O placar honesto

YouTube — vídeos agendados26%
TikTok — vídeos agendados42%
Meta Reels — vídeos publicados29%

Nenhum desses números é 100%, e as razões não são técnicas: o TikTok só libera agendamento 30 dias à frente, e o Meta impõe um limite de envios por período que aparece como um upload travado em 0% — sem erro, sem aviso, sem chamada de rede. A única correção é esperar.

Isso também é informação de engenharia. Metade do trabalho de publicar em escala não é publicar: é descobrir onde cada plataforma coloca o freio e parar de bater nele.


Na parte 3: um post que aparecia publicado, aparecia no perfil, e não existia para mais ninguém.

Perguntas frequentes

Por que não usar sempre seletor de elemento em vez de coordenada?

Porque nem sempre dá. Alguns componentes só respondem a evento de ponteiro real — o clique no elemento apenas dá foco. Nesses casos o certo é ler a posição do elemento no momento do clique, nunca reaproveitar uma coordenada de antes.

Qual foi a regra que finalmente estabilizou o processo?

Separar a verificação da ação. Enquanto conferíamos e clicávamos na mesma chamada, a conferência descrevia um estado que já não existia quando o clique acontecia. Conferir, e só na chamada seguinte agir.

Isso vale para teste automatizado de interface em geral?

Vale, e é a mesma lição dos testes end-to-end: assertar sobre estado que você controla, esperar por condição e não por tempo, e nunca guardar posição de tela entre passos. A diferença aqui é que a interface é de terceiros e muda sem aviso.