{"_id":"@agrotools1/at-e2e-kit","_rev":"5-486840cdc44962de8ee120c2c837c9b8","name":"@agrotools1/at-e2e-kit","dist-tags":{"latest":"1.0.0","beta":"0.0.1-beta.3"},"versions":{"0.0.1-beta.0":{"name":"@agrotools1/at-e2e-kit","version":"0.0.1-beta.0","keywords":["playwright","e2e","agrotools"],"author":{"name":"Agrotools"},"license":"MIT","_id":"@agrotools1/at-e2e-kit@0.0.1-beta.0","maintainers":[{"name":"agrotools-packages","email":"agrotools-packages@agrotools.com.br"},{"name":"tiago-agrotools","email":"tiago.baranzelli@agrotools.com.br"},{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},{"name":"guigonzalezv","email":"guilherme.gonzalez@agrotools.com.br"}],"dist":{"shasum":"996aee70a76e7fd3a477a6795b362bfc600809fc","tarball":"https://registry.npmjs.org/@agrotools1/at-e2e-kit/-/at-e2e-kit-0.0.1-beta.0.tgz","fileCount":5,"integrity":"sha512-dQX91jjiIVL/+ztUHHg9XFMgKm87A3NLbJ238Jod7z95jJi0aaw5tIjp5iKuTzU6W0IK6dBWGI34iDNYkA4lOg==","signatures":[{"sig":"MEQCIESOyBHPOY+kMxVTsE2iR7kZc22MVhWOhM7jQDqCxVidAiBC0/hZD/O83FPorAUtI+sYWCiidKUkXmVi/yrzyCjfRA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28956},"main":"dist/index.js","type":"module","_from":"file:agrotools1-at-e2e-kit-0.0.1-beta.0.tgz","types":"dist/index.d.ts","module":"dist/index.js","private":false,"scripts":{"lint":"eslint --ext .ts src --fix","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},"_resolved":"C:\\Users\\RAFAEL~1\\AppData\\Local\\Temp\\2ea8379ed5a6e3e4ef2a640439595aab\\agrotools1-at-e2e-kit-0.0.1-beta.0.tgz","_integrity":"sha512-dQX91jjiIVL/+ztUHHg9XFMgKm87A3NLbJ238Jod7z95jJi0aaw5tIjp5iKuTzU6W0IK6dBWGI34iDNYkA4lOg==","_npmVersion":"11.5.1","description":"Helpers e fixtures de Playwright compartilhados entre os microfrontends Agrotools (login via athost + navegação de módulo)","directories":{},"_nodeVersion":"24.5.0","dependencies":{"dotenv":"^16.4.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.1.6","@types/node":"^20.11.0","@playwright/test":"^1.61.0"},"peerDependencies":{"@playwright/test":">=1.40.0"},"_npmOperationalInternal":{"tmp":"tmp/at-e2e-kit_0.0.1-beta.0_1784040998470_0.1682688771717007","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-beta.1":{"name":"@agrotools1/at-e2e-kit","version":"0.0.1-beta.1","keywords":["playwright","e2e","agrotools"],"author":{"name":"Agrotools"},"license":"MIT","_id":"@agrotools1/at-e2e-kit@0.0.1-beta.1","maintainers":[{"name":"agrotools-packages","email":"agrotools-packages@agrotools.com.br"},{"name":"tiago-agrotools","email":"tiago.baranzelli@agrotools.com.br"},{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},{"name":"guigonzalezv","email":"guilherme.gonzalez@agrotools.com.br"}],"dist":{"shasum":"c843f2af1caf80f78e8e116839f26a4d24370d8d","tarball":"https://registry.npmjs.org/@agrotools1/at-e2e-kit/-/at-e2e-kit-0.0.1-beta.1.tgz","fileCount":5,"integrity":"sha512-sWSVjLPU1LWjS8kxbEAAkZOowwDObrI5mst3Kr7l6mD0OWsFWTpV0ajvJJWgs3Xnm8nw3X2ZV1UpM4h34E3+BA==","signatures":[{"sig":"MEQCIGCijUZp0sUfJolG6bwqDId/N2y4sAoccmBT7rEMzwT/AiBXz0IJ4/jigwoEL3rm492SCCyYX9ctRT/fUSlcWE2l9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34710},"main":"dist/index.js","type":"module","_from":"file:agrotools1-at-e2e-kit-0.0.1-beta.1.tgz","types":"dist/index.d.ts","module":"dist/index.js","private":false,"scripts":{"lint":"eslint --ext .ts src --fix","test":"vitest run","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},"_resolved":"C:\\Users\\RAFAEL~1\\AppData\\Local\\Temp\\2fd2b902e7d7df09b2e8de9c4d1362a9\\agrotools1-at-e2e-kit-0.0.1-beta.1.tgz","_integrity":"sha512-sWSVjLPU1LWjS8kxbEAAkZOowwDObrI5mst3Kr7l6mD0OWsFWTpV0ajvJJWgs3Xnm8nw3X2ZV1UpM4h34E3+BA==","_npmVersion":"11.5.1","description":"Helpers e fixtures de Playwright compartilhados entre os microfrontends Agrotools (login via athost + navegação de módulo)","directories":{},"_nodeVersion":"24.5.0","dependencies":{"dotenv":"^16.4.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^4.1.10","typescript":"^5.1.6","@types/node":"^20.11.0","@playwright/test":"^1.61.0"},"peerDependencies":{"@playwright/test":">=1.40.0"},"_npmOperationalInternal":{"tmp":"tmp/at-e2e-kit_0.0.1-beta.1_1784049438903_0.7207061573263951","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-beta.2":{"name":"@agrotools1/at-e2e-kit","version":"0.0.1-beta.2","keywords":["playwright","e2e","agrotools"],"author":{"name":"Agrotools"},"license":"MIT","_id":"@agrotools1/at-e2e-kit@0.0.1-beta.2","maintainers":[{"name":"agrotools-packages","email":"agrotools-packages@agrotools.com.br"},{"name":"tiago-agrotools","email":"tiago.baranzelli@agrotools.com.br"},{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},{"name":"guigonzalezv","email":"guilherme.gonzalez@agrotools.com.br"}],"dist":{"shasum":"03a4739176ccb6d2d102f00ed6f413033051e7a8","tarball":"https://registry.npmjs.org/@agrotools1/at-e2e-kit/-/at-e2e-kit-0.0.1-beta.2.tgz","fileCount":10,"integrity":"sha512-fTFnJAoHIz2QRV6it/A22r4kObEYPpF/8RDQ/zK33HtkaAbVx9xH9aEmqrx/r1fJG8VE93vaXAQcZtj7Afy0JA==","signatures":[{"sig":"MEUCIET0uLut9YGOCW282Zz8/0378tpI4eD5gvrISmsi0hHNAiEAgBusWb2nV6xUxBHqv2RCiJcAN9x/6BH+Ssisw2xtFkQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39790},"main":"dist/index.js","type":"module","_from":"file:agrotools1-at-e2e-kit-0.0.1-beta.2.tgz","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js","require":"./dist/config.cjs"}},"private":false,"scripts":{"lint":"eslint --ext .ts src --fix","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},"_resolved":"C:\\Users\\RAFAEL~1\\AppData\\Local\\Temp\\a36568504fa7e0ffa4545c2890a1256d\\agrotools1-at-e2e-kit-0.0.1-beta.2.tgz","_integrity":"sha512-fTFnJAoHIz2QRV6it/A22r4kObEYPpF/8RDQ/zK33HtkaAbVx9xH9aEmqrx/r1fJG8VE93vaXAQcZtj7Afy0JA==","_npmVersion":"11.5.1","description":"Helpers e fixtures de Playwright compartilhados entre os microfrontends Agrotools (login via athost + navegação de módulo)","directories":{},"_nodeVersion":"24.5.0","dependencies":{"dotenv":"^16.4.5"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"config":["dist/config.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^4.1.10","typescript":"^5.1.6","@types/node":"^20.11.0","@playwright/test":"^1.61.0"},"peerDependencies":{"@playwright/test":">=1.40.0"},"_npmOperationalInternal":{"tmp":"tmp/at-e2e-kit_0.0.1-beta.2_1784049832357_0.9757899111749895","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-beta.3":{"name":"@agrotools1/at-e2e-kit","version":"0.0.1-beta.3","keywords":["playwright","e2e","agrotools"],"author":{"name":"Agrotools"},"license":"MIT","_id":"@agrotools1/at-e2e-kit@0.0.1-beta.3","maintainers":[{"name":"agrotools-packages","email":"agrotools-packages@agrotools.com.br"},{"name":"tiago-agrotools","email":"tiago.baranzelli@agrotools.com.br"},{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},{"name":"guigonzalezv","email":"guilherme.gonzalez@agrotools.com.br"}],"dist":{"shasum":"c70e1a069869d37730657469cc1c4706226671f9","tarball":"https://registry.npmjs.org/@agrotools1/at-e2e-kit/-/at-e2e-kit-0.0.1-beta.3.tgz","fileCount":10,"integrity":"sha512-fg6ogFz6y5BfD03fxcjr18KZIvaBdBYX5KXsmc/PsK3+ZNMr2C1q8POltTry6EkSGYuv1waP26ByPUVybiojZQ==","signatures":[{"sig":"MEQCIGItBlMwK8ePHNkTCuPPGd2FlxlnO/GvDzJq2P8vF3TMAiAZX4Oxd2sIyqG7w/grMTr2jU4aH8OYt4ivFEAuU/44ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40825},"main":"dist/index.js","type":"module","_from":"file:agrotools1-at-e2e-kit-0.0.1-beta.3.tgz","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js","require":"./dist/config.cjs"}},"private":false,"scripts":{"lint":"eslint --ext .ts src --fix","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},"_resolved":"C:\\Users\\RAFAEL~1\\AppData\\Local\\Temp\\6e4171861b398478b134588736c832c6\\agrotools1-at-e2e-kit-0.0.1-beta.3.tgz","_integrity":"sha512-fg6ogFz6y5BfD03fxcjr18KZIvaBdBYX5KXsmc/PsK3+ZNMr2C1q8POltTry6EkSGYuv1waP26ByPUVybiojZQ==","_npmVersion":"11.5.1","description":"Helpers e fixtures de Playwright compartilhados entre os microfrontends Agrotools (login via athost + navegação de módulo)","directories":{},"_nodeVersion":"24.5.0","dependencies":{"dotenv":"^16.4.5"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"config":["dist/config.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^4.1.10","typescript":"^5.1.6","@types/node":"^20.11.0","@playwright/test":"^1.61.0"},"peerDependencies":{"@playwright/test":">=1.40.0"},"_npmOperationalInternal":{"tmp":"tmp/at-e2e-kit_0.0.1-beta.3_1784051113459_0.05654606989493827","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@agrotools1/at-e2e-kit","version":"1.0.0","type":"module","private":false,"description":"Helpers e fixtures de Playwright compartilhados entre os microfrontends Agrotools (login via athost + navegação de módulo)","author":{"name":"Agrotools"},"license":"MIT","keywords":["playwright","e2e","agrotools"],"main":"dist/index.js","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js","require":"./dist/config.cjs"},"./setup":{"types":"./dist/setup.d.ts","import":"./dist/setup.js","require":"./dist/setup.cjs"}},"typesVersions":{"*":{"config":["dist/config.d.ts"],"setup":["dist/setup.d.ts"]}},"publishConfig":{"access":"public"},"peerDependencies":{"@playwright/test":">=1.40.0"},"dependencies":{"dotenv":"^16.4.5"},"devDependencies":{"@eslint/js":"^10.0.1","@playwright/test":"^1.61.0","@types/node":"^20.11.0","eslint":"^10.8.0","tsup":"^8.0.0","typescript":"^5.1.6","typescript-eslint":"^8.65.0","vitest":"^4.1.10"},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","lint":"eslint src --fix","test":"vitest run","test:watch":"vitest"},"_id":"@agrotools1/at-e2e-kit@1.0.0","_integrity":"sha512-1jIyz9Q1o7WYvbfVIQkLgUvIRalPvtqdmQTUJmAfQVaH1VO0OL5hflXHdg3yz3AQ+Gjib9NIcHH2jnfAkPI2Ng==","_resolved":"C:\\Users\\RAFAEL~1\\AppData\\Local\\Temp\\3f0cc9a93a26dbc6100fd6c72d1e32ee\\agrotools1-at-e2e-kit-1.0.0.tgz","_from":"file:agrotools1-at-e2e-kit-1.0.0.tgz","_nodeVersion":"24.5.0","_npmVersion":"11.5.1","dist":{"integrity":"sha512-1jIyz9Q1o7WYvbfVIQkLgUvIRalPvtqdmQTUJmAfQVaH1VO0OL5hflXHdg3yz3AQ+Gjib9NIcHH2jnfAkPI2Ng==","shasum":"9291b5345f2d5d31fdd7d7d1672e36e616632e86","tarball":"https://registry.npmjs.org/@agrotools1/at-e2e-kit/-/at-e2e-kit-1.0.0.tgz","fileCount":16,"unpackedSize":52312,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICgtcKKolPxX+YFHQ2uJaGCNROfklZDc1X6W4z9AQ/fHAiBU8M40I4CGJoWJB/e//bC26fUm0LbalRBxHgdkBVOe0g=="}]},"_npmUser":{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},"directories":{},"maintainers":[{"name":"agrotools-packages","email":"agrotools-packages@agrotools.com.br"},{"name":"tiago-agrotools","email":"tiago.baranzelli@agrotools.com.br"},{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},{"name":"guigonzalezv","email":"guilherme.gonzalez@agrotools.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/at-e2e-kit_1.0.0_1786135942922_0.4082892996470815"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-14T14:56:38.356Z","modified":"2026-08-07T20:52:23.325Z","0.0.1-beta.0":"2026-07-14T14:56:38.608Z","0.0.1-beta.1":"2026-07-14T17:17:19.035Z","0.0.1-beta.2":"2026-07-14T17:23:52.496Z","0.0.1-beta.3":"2026-07-14T17:45:13.600Z","1.0.0":"2026-08-07T20:52:23.096Z"},"author":{"name":"Agrotools"},"license":"MIT","keywords":["playwright","e2e","agrotools"],"description":"Helpers e fixtures de Playwright compartilhados entre os microfrontends Agrotools (login via athost + navegação de módulo)","maintainers":[{"name":"agrotools-packages","email":"agrotools-packages@agrotools.com.br"},{"name":"tiago-agrotools","email":"tiago.baranzelli@agrotools.com.br"},{"name":"rafaeldiasagroo","email":"rafael.dias_EXT@agrotools.com.br"},{"name":"guigonzalezv","email":"guilherme.gonzalez@agrotools.com.br"}],"readme":"# at-e2e-kit\r\n\r\nHelpers e fixtures de Playwright compartilhados entre os microfrontends Agrotools: login automático via athost + navegação de módulo.\r\n\r\n📦 npm: [`@agrotools1/at-e2e-kit`](https://www.npmjs.com/package/@agrotools1/at-e2e-kit)\r\n\r\n## Setup\r\n\r\n**1. Instalar** (`@playwright/test` >=1.40.0 é peer dep):\r\n\r\n```bash\r\npnpm add -D @agrotools1/at-e2e-kit @playwright/test\r\npnpm exec playwright install chromium\r\n```\r\n\r\n**2. `playwright.config.ts`** na raiz:\r\n\r\n```ts\r\nimport { createE2EConfig } from '@agrotools1/at-e2e-kit/config'\r\n\r\nexport default createE2EConfig({\r\n  moduleBasePath: '/paineladministrativo', // path do módulo dentro do shell (athost)\r\n})\r\n```\r\n\r\nConfigura sozinho: retries, reporter, trace/screenshot/video on-failure, bypass de cert para `api-test-homolog.agrotools.com.br`, e os projects `setup` (login) + `chromium` (`dependencies: ['setup']`, injeta a sessão salva). Testes em `./tests/e2e`. `automaticLogin: false` se o módulo não precisa de login; `overrides` pra sobrescrever campo pontual (ex: `viewport`).\r\n\r\n**3. Auto-login** — crie um `*.setup.ts` em `tests/e2e/` (regex do project `setup` é `/.*\\.setup\\.ts/`):\r\n\r\n```ts\r\n// tests/e2e/auth.setup.ts\r\nimport '@agrotools1/at-e2e-kit/setup'\r\n```\r\n\r\nO import já registra o teste de bootstrap, roda no project `setup` antes do resto, salva a sessão em `tests/e2e/.auth/user.json` e reaproveita enquanto for válida — não loga de novo a cada run.\r\n\r\n**4. Env vars** — `.env.test`, `.env.development` etc., no mínimo:\r\n\r\n```bash\r\nPLAYWRIGHT_USER_EMAIL=\"seu-email@agrotools.com.br\"\r\nPLAYWRIGHT_USER_PASSWORD=\"sua-senha\"\r\n```\r\n\r\nLista completa + ordem de cascata: [Variáveis de ambiente](#variáveis-de-ambiente).\r\n\r\n**5. `.gitignore`** — sessão e evidências nunca vão pro commit:\r\n\r\n```gitignore\r\ntests/e2e/.auth\r\ntests/e2e/videos\r\n/test-results\r\n/playwright-report\r\n/playwright/.cache\r\n```\r\n\r\n**6. Primeiro teste:**\r\n\r\n```ts\r\n// tests/e2e/exemplo.spec.ts\r\nimport { expect, test } from '@playwright/test'\r\nimport { openRoute } from '@agrotools1/at-e2e-kit'\r\n\r\ntest('exemplo', async ({ page }) => {\r\n  await openRoute(page, '/minha-rota')\r\n  await expect(page.locator('h1')).toBeVisible()\r\n})\r\n```\r\n\r\n`openRoute` já garante o boot da sessão (`ensureShellBooted`) antes de navegar. Não chame `page.goto` direto.\r\n\r\n**7. Rodar** — scripts sugeridos pro `package.json` do consumidor:\r\n\r\n```json\r\n{\r\n  \"scripts\": {\r\n    \"test:e2e\": \"playwright test\",\r\n    \"test:e2e:headed\": \"playwright test --headed --workers=1\",\r\n    \"test:e2e:ui\": \"playwright test --ui\",\r\n    \"test:e2e:evidence\": \"cross-env RECORD_EVIDENCE=true playwright test --headed --workers=1\",\r\n    \"test:e2e:login:reset\": \"node -e \\\"require('fs').rmSync('tests/e2e/.auth/user.json', { force: true })\\\"\"\r\n  }\r\n}\r\n```\r\n\r\n| Script | Faz |\r\n| --- | --- |\r\n| `test:e2e` | Headless (sem browser visível — normal, não é bug) |\r\n| `test:e2e:headed` | Browser de verdade, pra debugar |\r\n| `test:e2e:ui` | UI mode |\r\n| `test:e2e:evidence` | Grava vídeo de cada teste ([evidência em vídeo](#evidência-em-vídeo)) |\r\n| `test:e2e:login:reset` | Reseta a sessão salva, força login de novo (sessão expirada / trocou usuário de teste) |\r\n\r\n## API\r\n\r\n### Navegação\r\n\r\n`openRoute(page, path)` e `ensureShellBooted(page)` — o segundo é chamado internamente pelo primeiro, só use direto se precisar do boot sem navegar em seguida.\r\n\r\n### ⚠️ Mocks e ordem LIFO\r\n\r\n`ensureShellBooted` registra `mockCertBypassRoute` internamente toda vez que a page ainda não está na URL do módulo (pode rodar mais de uma vez durante boot/navegação). Playwright resolve `page.route()` em LIFO — último handler registrado ganha. Isso quebra a intuição: se você registrar um mock específico (`page.route('**/minha-api/**', ...)`) **antes** de `openRoute`, e o host da API coincidir com `api-test-homolog.agrotools.com.br`, o bypass genérico registrado depois pode vencer o seu — mesmo o seu tendo sido registrado primeiro.\r\n\r\nSintoma: componente recebe `{}` do bypass em vez do seu fixture, quebra silencioso em qualquer código que espere array/objeto.\r\n\r\nFix: registre mocks específicos **depois** de `openRoute`, com reload se o fetch já tiver disparado:\r\n\r\n```ts\r\nawait openRoute(page, '/')\r\n\r\nawait page.route('**/minha-api/**', (route) => route.fulfill({ status: 200, body: '...' }))\r\nawait page.reload()\r\nawait page.waitForLoadState('networkidle')\r\n```\r\n\r\n`mockCertBypassRoute(page)` também é exportado — chame direto num `beforeEach` se quiser garantir que o bypass já está registrado antes de qualquer coisa. É o que a maioria dos módulos faz na prática, em vez de depender só do registro interno.\r\n\r\n### Helpers de UI\r\n\r\n| Helper | Faz |\r\n| --- | --- |\r\n| `findFirstVisible(page, selectors)` | Primeiro `Locator` visível de uma lista de seletores, ou `null` |\r\n| `openAnyDropdown(page)` | Clica no primeiro trigger de dropdown visível (`[role=\"combobox\"]`, Radix, Reka UI), retorna `{ trigger, content }` |\r\n| `computedStyle(locator, property)` | CSS computado do elemento |\r\n| `boundingBoxOrFail(locator, name)` | Como `boundingBox()`, mas lança erro descritivo (com `name`) se vier `null` |\r\n\r\n### Console\r\n\r\n```ts\r\nimport { collectConsole, assertNoForbiddenConsole } from '@agrotools1/at-e2e-kit'\r\n\r\ntest('sem erros de console proibidos', async ({ page }) => {\r\n  const messages = collectConsole(page)\r\n  // ...\r\n  assertNoForbiddenConsole(messages)\r\n})\r\n```\r\n\r\n`collectConsole` acumula `console.error`/`console.warning`/`pageerror` conforme acontecem. `assertNoForbiddenConsole` lança erro se alguma mensagem contiver `Portal`, `Floating UI` ou `Reka UI` — vazamento clássico de warning de UI lib por uso incorreto de componente.\r\n\r\n### Evidência em vídeo\r\n\r\n`saveVideoEvidence(page, videoName)` fecha a page e renomeia o vídeo gravado pelo Playwright pra `tests/e2e/videos/<videoName>-<timestamp>.webm`, resgatando o arquivo antes do cleanup padrão de `retain-on-failure` (não precisa mexer em `video.mode`). Gate por `RECORD_EVIDENCE` pra só gravar quando pedido:\r\n\r\n```ts\r\nif (process.env.RECORD_EVIDENCE) {\r\n  await saveVideoEvidence(page, 'exemplo-evidence')\r\n}\r\n```\r\n\r\n## Variáveis de ambiente\r\n\r\nCascata (primeiro valor definido vence): `.env.test.local` → `.env.test` → `.env.development.local` → `.env.development` → `.env.local` → `.env.homolog` → `.env`\r\n\r\n| Variável | Descrição |\r\n| --- | --- |\r\n| `E2E_BASE_URL` | URL base do shell (athost). Default `http://localhost:3333` |\r\n| `E2E_MODULE_BASE_PATH` | Path base do módulo dentro do shell (ex: `/paineladministrativo`) |\r\n| `E2E_API_HOST` | Host da API usado no bypass de certificado (`mockCertBypassRoute` + `launchOptions` de auto-select de certificado). Default `api-test-homolog.agrotools.com.br` |\r\n| `PLAYWRIGHT_USER_EMAIL` / `PLAYWRIGHT_USER_PASSWORD` | Credenciais de login via Global Account |\r\n| `RECORD_EVIDENCE` | Liga a gravação de vídeo via `saveVideoEvidence` |\r\n\r\nNunca commite valor real em `.env.development`/`.env.homolog`/etc versionados — use `.env.*.local` (gitignored).\r\n\r\n## Dev do kit\r\n\r\n```bash\r\npnpm build       # dist/ via tsup\r\npnpm typecheck   # tsc --noEmit\r\npnpm lint        # eslint --fix\r\npnpm test        # vitest run\r\npnpm test:watch  # vitest watch\r\n```\r\n\r\nBranches: `main` (protegida, PR obrigatório) · `test` (espelha o ambiente de teste)\r\n\r\nPR a partir de uma branch de feature. Antes de abrir: `pnpm typecheck && pnpm test && pnpm build` (mesmo comando do `prepublishOnly`).\r\n","readmeFilename":"README.md"}