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. O nome do arquivo persegue você
  6. As três regras que sobraram
  7. 1. Nunca reaproveitar coordenada entre chamadas
  8. 2. Verificar numa chamada separada da ação
  9. 3. Esperar por condição, nunca por tempo
  10. O que isso tem a ver com desenvolver aplicativo
  11. 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 minuto tem lógica própria: quando a hora está na linha do meio, o "00" cai na primeira linha — e aí o clique é direto, sem rolagem.

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.

E o TikTok tem uma peculiaridade que não é bug nenhum: o primeiro upload sempre falha. Não às vezes — sempre. O console entrega o motivo sem rodeio:

web upload is under Vmok mode
selectVideoFiles-start does not exist

É proteção anti-automação, e ela não tem contorno esperto: recarregar a página e repetir o envio funciona, todas as vezes. O que muda é como você trata isso no procedimento. Enquanto tratamos como erro, cada vídeo virava uma investigação. Quando viramos a chave e escrevemos "recarregar depois da primeira falha" como passo 2 da receita, o custo caiu a zero.

Falha determinística não é falha: é uma etapa que ainda não foi escrita no procedimento. O gasto real não estava no retrabalho, estava em rediagnosticar a mesma coisa quinze vezes.

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.

O nome do arquivo persegue você

Vale isolar uma coincidência que não é coincidência. No YouTube, o título voltava a ser o nome do arquivo. No TikTok, a descrição já nasce preenchida com o nome do arquivo — e nos vídeos 9 e 10 ela ignorou a primeira digitação e manteve o valor original. Clicar no campo de novo e repetir resolveu; na segunda vez pega.

Duas plataformas sem relação, dois campos diferentes, o mesmo sintoma. A causa comum não está no YouTube nem no TikTok: está em campo com valor padrão que o framework restaura quando a escrita nova não é reconhecida como estado. O nome do arquivo é só o valor padrão mais comum do mundo em formulário de upload.

Isso muda o que se procura. Não é "por que essa plataforma apaga meu texto", é "qual é o valor que essa tela considera verdadeiro quando duvida de mim".

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.