Estou tentando escrever um teste de dramaturgo que faça algo após o envio de um formulário. Depois que o formulário é enviado, duas coisas acontecem:
- uma "gaveta" fecha
- uma "notificação" aparece
O problema é que a ordem dessas duas coisas pode mudar, apenas devido à aleatoriedade. Então, se eu fizer:
await expectDrawerToClose();
await expectNotification();
ou:
await expectNotification();
await expectDrawerToClose();
... de qualquer forma, às vezes será errado. Existe alguma maneira no Playwright de fazer de alguma forma:
await expectTwoThingsToHappenInAnyOrder(
expectDrawerToClose(),
expectNotification()
);
Eu sei que posso encadear localizadores com or
, mas isso não é a mesma coisa: não quero dizer "Vou ver uma dessas duas coisas acontecer" ... quero dizer "Vou ver ambos acontecem; eu simplesmente não me importo com a ordem."
Não há necessidade, na maioria das vezes. As asserções sequenciais simplesmente funcionam, desde que o comportamento não esteja executando um bloqueio completo na página (como seria o caso de um
alert()
, que impede a renderização) ou se um estado desaparecer enquanto o Playwright ainda estiver aguardando a outra condição.Considere o seguinte exemplo:
Embora os dois eventos aconteçam em ordem arbitrária nos 2 segundos seguintes ao clique, é garantido que este teste será aprovado. A ordem das afirmações não importa.
Com base em um de seus comentários , você observa que a notificação pode ser descartada após um curto período. Nesse caso, a ordem é importante. Afirme o estado temporário antes do estado mais longo/permanente:
Se ambos os estados desaparecerem de forma não determinística e precisarem ser afirmados de forma verdadeiramente simultânea, você poderá usar
Promise.all
:Se você descobrir que está usando o
Promise.all()
padrão com frequência em seus testes, então ou você tem um site extraordinariamente dinâmico e notável ou está usando-o demais (provavelmente o último). Prefira afirmações lineares ordenadas corretamente, como o trecho 2 acima, a menos que realmente não haja outra opção.Se você quiser pegar o primeiro de vários estados e ignorar o resto, use
Promise.race
em vez dePromise.all
. Veja esta postagem para ver um exemplo. Use criteriosamente.se não estiver usando
@playwright/test
, você pode removerexpect
s e usar.waitFor()
em vez de.toBeVisible()
.