Neste post
- TikTok: o seletor de hora que anda de três em três
- X: a barra que muda de altura
- Meta: o clique que abre uma caixa de diálogo do sistema
- O padrão
- As três regras que sobraram
- 1. Nunca reaproveitar coordenada entre chamadas
- 2. Verificar numa chamada separada da ação
- 3. Esperar por condição, nunca por tempo
- O que isso tem a ver com desenvolver aplicativo
- 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 compositor | Posição do botão |
|---|---|
| Texto de 1 linha | y = 312 |
| Texto de 2 linhas | y = 337 |
| Card de preview do site já carregado | y = 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:
| Plataforma | O que se mexe | O que quebra |
|---|---|---|
| YouTube | O campo de título cresce ao receber texto | O clique na descrição cai dentro do título |
| TikTok | O dropdown abre para cima ou para baixo | Seleciona a hora errada, em silêncio |
| X | A barra sobe quando o preview carrega | O clique de agendar erra o botão |
| Meta | O elemento de upload nasce na hora do clique | A caixa do sistema trava tudo |
| A grade muda depois do upload | O botão "Avançar" muda de lugar | |
| O editor troca entre markdown e rich text | O 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
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.