test(e2e): fluxos de contato, navegação, teclado e menu do celular mais rígidos
This commit is contained in:
1 parent
8903f3c57e
commit
02298779df
8 files changed
+321
-115
No files matched your search
+54
-7
@@ -1,12 +1,19 @@
|
||||
import { expect, type Page, test } from "@playwright/test";
|
||||
import { DESKTOP } from "./helpers";
|
||||
import {
|
||||
COOKIE_BAR_CONTROLS,
|
||||
cookieBar,
|
||||
DESKTOP_USE,
|
||||
saveConsent,
|
||||
} from "./helpers";
|
||||
|
||||
/**
|
||||
* (c) Teclado, no computador:
|
||||
* (a) atalho: Tab até "Falar sobre meu projeto" no cabeçalho, Enter, e o campo de nome do contato em até 4 Tabs.
|
||||
* Só no computador: no celular o botão do hero abre o WhatsApp, não o formulário.
|
||||
* (b) caminho linear: do topo da home, o Tab chega ao campo de nome do contato em até 36 toques
|
||||
* (a vitrine de projetos é navegada com as setas: um seletor e o link do case; ver o inventário em LINEAR_MAX_TABS).
|
||||
* (b) caminho linear: do topo da home, o Tab chega ao campo de nome do contato em até 36 toques, mais os controles da
|
||||
* barra de cookies enquanto ela estiver aberta (primeira visita: 36 + 3 = 39; com o consentimento já salvo a barra
|
||||
* não abre e o limite é 36). A vitrine de projetos é navegada com as setas: um seletor e o link do case; ver o
|
||||
* inventário em LINEAR_MAX_TABS.
|
||||
* Os testes continuam apertando Tab depois do limite só para dizer, na falha, quantos toques faltavam.
|
||||
*/
|
||||
|
||||
@@ -25,9 +32,12 @@ const SHORTCUT_MAX_TABS_AFTER_ENTER = 4;
|
||||
* Tudo isso é conteúdo e navegação que a pessoa quer alcançar; o limite não deve subir sem uma parada nova justificada.
|
||||
*/
|
||||
const LINEAR_MAX_TABS = 36;
|
||||
/** Primeira visita: a barra de cookies abre antes do cabeçalho e soma os controles dela (link da política, Aceitar, Recusar). */
|
||||
const LINEAR_MAX_TABS_FIRST_VISIT =
|
||||
LINEAR_MAX_TABS + COOKIE_BAR_CONTROLS.length;
|
||||
const LINEAR_GIVE_UP_AFTER = 120;
|
||||
|
||||
test.use({ viewport: DESKTOP });
|
||||
test.use(DESKTOP_USE);
|
||||
|
||||
/** Descreve o elemento com foco e diz se é o botão de contato do cabeçalho ou o campo de nome do contato. */
|
||||
async function focusedElement(page: Page) {
|
||||
@@ -56,12 +66,22 @@ async function focusedElement(page: Page) {
|
||||
}, CTA_LABEL);
|
||||
}
|
||||
|
||||
/** Visita nova: foco no documento, topo da página. */
|
||||
async function openHomeAsNewVisitor(page: Page) {
|
||||
/**
|
||||
* Visita nova: foco no documento, topo da página. Com `consent`, o consentimento já estava salvo no navegador (a barra
|
||||
* de cookies não abre); sem ele é a primeira visita, e a barra de cookies tem de estar aberta.
|
||||
*/
|
||||
async function openHomeAsNewVisitor(
|
||||
page: Page,
|
||||
consent?: "granted" | "denied",
|
||||
) {
|
||||
if (consent) await saveConsent(page, consent);
|
||||
await page.goto("/", { waitUntil: "load" });
|
||||
await page.waitForTimeout(800);
|
||||
await page.evaluate(() => (document.activeElement as HTMLElement)?.blur());
|
||||
await page.evaluate(() => window.scrollTo({ top: 0, behavior: "instant" }));
|
||||
const bar = page.getByRole("dialog", { name: "Cookies e privacidade" });
|
||||
if (consent) await expect(bar).toHaveCount(0);
|
||||
else await cookieBar(page);
|
||||
}
|
||||
|
||||
/** Aperta Tab até o foco satisfazer `stop`, no máximo `giveUpAfter` vezes. `reached` é 0 se nunca satisfez. */
|
||||
@@ -116,10 +136,37 @@ test(`atalho: Tab até "${CTA_LABEL}" do cabeçalho, Enter, e o campo de nome em
|
||||
await expect(page.locator("#contact input[name='name']")).toBeFocused();
|
||||
});
|
||||
|
||||
test(`caminho linear: do topo da home, Tab chega ao campo de nome do contato em até ${LINEAR_MAX_TABS} toques`, async ({
|
||||
test(`caminho linear, primeira visita (barra de cookies aberta): do topo da home, Tab chega ao campo de nome do contato em até ${LINEAR_MAX_TABS_FIRST_VISIT} toques (${LINEAR_MAX_TABS} + os ${COOKIE_BAR_CONTROLS.length} controles da barra)`, async ({
|
||||
page,
|
||||
}) => {
|
||||
await openHomeAsNewVisitor(page);
|
||||
const bar = await cookieBar(page);
|
||||
expect(
|
||||
await bar.locator("a[href], button").count(),
|
||||
"controles focáveis da barra de cookies",
|
||||
).toBe(COOKIE_BAR_CONTROLS.length);
|
||||
|
||||
const { reached, visited } = await tabUntil(
|
||||
page,
|
||||
({ isName }) => isName,
|
||||
LINEAR_GIVE_UP_AFTER,
|
||||
);
|
||||
|
||||
expect(
|
||||
reached,
|
||||
`o campo de nome não apareceu nem em ${LINEAR_GIVE_UP_AFTER} Tabs`,
|
||||
).toBeGreaterThan(0);
|
||||
expect(
|
||||
reached,
|
||||
`o campo de nome só foi alcançado no Tab ${reached} (limite ${LINEAR_MAX_TABS_FIRST_VISIT}); passou por:\n${visited.join("\n")}`,
|
||||
).toBeLessThanOrEqual(LINEAR_MAX_TABS_FIRST_VISIT);
|
||||
await expect(page.locator("#contact input[name='name']")).toBeFocused();
|
||||
});
|
||||
|
||||
test(`caminho linear, com o consentimento já salvo (sem a barra de cookies): Tab chega ao campo de nome do contato em até ${LINEAR_MAX_TABS} toques`, async ({
|
||||
page,
|
||||
}) => {
|
||||
await openHomeAsNewVisitor(page, "denied");
|
||||
|
||||
const { reached, visited } = await tabUntil(
|
||||
page,
|
||||
|
||||
Reference in new issue
Block a user