Pular para o conteúdo principal

Relógio falso e 2ª passada

A 2ª passada​

Sites que buscam o CEP sobrescrevem rua, bairro ou complemento logo depois do preenchimento. Por isso, botai.preencher espera cerca de 1 s e regrava o que mudou desde a leitura. A Promise só resolve depois dessa 2ª passada.

Ela vem ligada. Ela só regrava o que o Botaí já tinha escrito: um campo que só habilita depois da busca de CEP continua vazio.

Com o relógio falso​

O page.clock do Playwright controla os timers da página, inclusive o da 2ª passada:

RelógioA 2ª passada
só page.clock.install()não atrapalha: a Promise resolve em cerca de 1 s
parado: page.clock.install({ time }) + page.clock.pauseAt(…)fica presa: a Promise não resolve até o timeout do teste
informação

O README do pacote 0.1.0 diz que page.clock.install() segura a 2ª passada. Não segura: quem segura é o relógio parado.

Com o relógio parado, escolha uma das duas saídas abaixo.

Saída 1: pular a 2ª passada​

import { test } from '@pilutech/botai-playwright'

test('cadastro com o relógio parado', async ({ page, botai }) => {
await page.clock.install({ time: new Date('2026-10-05T08:00:00') })
await page.goto('/cadastro')
await page.clock.pauseAt(new Date('2026-10-05T10:00:00'))

const r = await botai.preencher(page, { segundaPassada: false })
})

Sem a 2ª passada, uma busca de CEP do site pode sobrescrever rua, bairro ou complemento, e o teste vê o valor do site.

Saída 2: andar o relógio​

import { test, expect } from '@pilutech/botai-playwright'

test('cadastro com o relógio parado', async ({ page, botai }) => {
await page.clock.install({ time: new Date('2026-10-05T08:00:00') })
await page.goto('/cadastro')
await page.clock.pauseAt(new Date('2026-10-05T10:00:00'))

const preenchimento = botai.preencher(page)
await expect(page.getByLabel('CEP')).not.toHaveValue('')
await page.clock.runFor(1500)
const r = await preenchimento
})

Espere a 1ª passada escrever antes do runFor: o timer da 2ª passada só existe depois dela. Um runFor chamado logo depois do botai.preencher, sem a espera, pode correr antes do timer, e a Promise fica presa do mesmo jeito.

O runFor(1500) também dispara os timers do próprio site que vencem nesse intervalo, como o de uma busca de CEP.

O exemplo espera um campo da página principal. Se a página tem campos em iframes, a saída 1 é a mais simples.