e2e — E2E 테스트 설정 always-be-running, community, E2E 테스트 설정, ide skills, Node.js 테스트, npm 테스트, BrowserManager, 시스템 Chrome, AI 에이전트 테스트

v1.0.0

이 스킬 정보

Node와 브라우저 자동화 에이전트에 적합합니다. 끝에서 끝까지 테스트 기능이 필요한 경우 별도의 package.json 파일과 BrowserManager 가져오기를 사용합니다. E2E 테스트는 소프트웨어 테스트 방법의 하나로 사용자의 행동을 시뮬레이션합니다

기능

Node.js 10과 npm 6 지원
최신 npm과 Node.js 20 지원
BrowserManager导入
시스템 Chrome 지원

# Core Topics

madarasz madarasz
[23]
[5]
Updated: 3/18/2026

Killer-Skills Review

Decision support comes first. Repository text comes second.

Reference-Only Page Review Score: 10/11

This page remains useful for operators, but Killer-Skills treats it as reference material instead of a primary organic landing page.

Original recommendation layer Concrete use-case guidance Explicit limitations and caution Quality floor passed for review
Review Score
10/11
Quality Score
59
Canonical Locale
en
Detected Body Locale
en

Node와 브라우저 자동화 에이전트에 적합합니다. 끝에서 끝까지 테스트 기능이 필요한 경우 별도의 package.json 파일과 BrowserManager 가져오기를 사용합니다. E2E 테스트는 소프트웨어 테스트 방법의 하나로 사용자의 행동을 시뮬레이션합니다

이 스킬을 사용하는 이유

에이전트가 끝에서 끝까지 테스트를 실행할 수 있는 능력을 부여합니다. Node 20과 최신 npm을 사용하여 BrowserManager 가져오기와 executablePath 구성으로 시ーム리스한 브라우저 자동화와 테스트를 구현합니다. 프로토콜로 npm test를 사용합니다.

최적의 용도

Node와 브라우저 자동화 에이전트에 적합합니다. 끝에서 끝까지 테스트 기능이 필요한 경우 별도의 package.json 파일과 BrowserManager 가져오기를 사용합니다.

실행 가능한 사용 사례 for e2e

Node와 브라우저 자동화의 끝에서 끝까지 테스트를 설정하기 위해 별도의 package.json 파일을 사용합니다
테스트/ 디렉토리 내부에서 테스트를 실행합니다. npm test를 사용합니다
에이전트와 브라우저 상호 작용을 위한 BrowserManager 가져오기를 구성합니다

! 보안 및 제한 사항

  • Node 20과 최신 npm을 사용하기 위해 별도의 테스트/패키지.json 파일이 필요합니다
  • 패키지에 내보내기 맵이 없으므로 BrowserManager에는 직접 경로 가져오기가 필요합니다
  • 시스템 크롬으로 제한되며 executablePath 구성이 사용됩니다

Why this page is reference-only

  • - Current locale does not satisfy the locale-governance contract.

Source Boundary

The section below is imported from the upstream repository and should be treated as secondary evidence. Use the Killer-Skills review above as the primary layer for fit, risk, and installation decisions.

After The Review

Decide The Next Action Before You Keep Reading Repository Material

Killer-Skills should not stop at opening repository instructions. It should help you decide whether to install this skill, when to cross-check against trusted collections, and when to move into workflow rollout.

Labs Demo

Browser Sandbox Environment

⚡️ Ready to unleash?

Experience this Agent in a zero-setup browser environment powered by WebContainers. No installation required.

Boot Container Sandbox

FAQ & Installation Steps

These questions and steps mirror the structured data on this page for better search understanding.

? Frequently Asked Questions

What is e2e?

Node와 브라우저 자동화 에이전트에 적합합니다. 끝에서 끝까지 테스트 기능이 필요한 경우 별도의 package.json 파일과 BrowserManager 가져오기를 사용합니다. E2E 테스트는 소프트웨어 테스트 방법의 하나로 사용자의 행동을 시뮬레이션합니다

How do I install e2e?

Run the command: npx killer-skills add madarasz/always-be-running/e2e. It works with Cursor, Windsurf, VS Code, Claude Code, and 19+ other IDEs.

What are the use cases for e2e?

Key use cases include: Node와 브라우저 자동화의 끝에서 끝까지 테스트를 설정하기 위해 별도의 package.json 파일을 사용합니다, 테스트/ 디렉토리 내부에서 테스트를 실행합니다. npm test를 사용합니다, 에이전트와 브라우저 상호 작용을 위한 BrowserManager 가져오기를 구성합니다.

Which IDEs are compatible with e2e?

This skill is compatible with Cursor, Windsurf, VS Code, Trae, Claude Code, OpenClaw, Aider, Codex, OpenCode, Goose, Cline, Roo Code, Kiro, Augment Code, Continue, GitHub Copilot, Sourcegraph Cody, and Amazon Q Developer. Use the Killer-Skills CLI for universal one-command installation.

Are there any limitations for e2e?

Node 20과 최신 npm을 사용하기 위해 별도의 테스트/패키지.json 파일이 필요합니다. 패키지에 내보내기 맵이 없으므로 BrowserManager에는 직접 경로 가져오기가 필요합니다. 시스템 크롬으로 제한되며 executablePath 구성이 사용됩니다.

How To Install

  1. 1. Open your terminal

    Open the terminal or command line in your project directory.

  2. 2. Run the install command

    Run: npx killer-skills add madarasz/always-be-running/e2e. The CLI will automatically detect your IDE or AI agent and configure the skill.

  3. 3. Start using the skill

    The skill is now active. Your AI agent can use e2e immediately in the current project.

! Reference-Only Mode

This page remains useful for installation and reference, but Killer-Skills no longer treats it as a primary indexable landing page. Read the review above before relying on the upstream repository instructions.

Upstream Repository Material

The section below is imported from the upstream repository and should be treated as secondary evidence. Use the Killer-Skills review above as the primary layer for fit, risk, and installation decisions.

Upstream Source

e2e

E2E 테스트 설정과 실행 방법을 알아보세요

SKILL.md
Readonly
Upstream Repository Material
The section below is imported from the upstream repository and should be treated as secondary evidence. Use the Killer-Skills review above as the primary layer for fit, risk, and installation decisions.
Supporting Evidence

E2E Test Conventions

Setup Notes

  • Separate tests/package.json: Root package.json uses Node 10/npm 6 for Gulp builds. Tests live in tests/ with their own package.json (Node 20 / modern npm). Run tests from inside tests/ with npm test.
  • BrowserManager import: import { BrowserManager } from 'agent-browser/dist/browser.js' (no exports map in the package, so the direct path import is required)
  • System Chrome: executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' — no need to install Playwright browsers separately
  • Credentials: Copy tests/e2e/.env.template to tests/e2e/.env and fill in NetrunnerDB usernames/passwords. The .env file is gitignored.

Rules — always apply these

  1. Run tests after every change: cd tests && npm test. Never leave the session with failing tests.

  2. Playwright strict mode — throws if a locator matches more than one element:

    • Use .first() when the same text appears in navbar and body
    • Use #id selectors when text= would be ambiguous
    • Examples: .locator('text=Login via NetrunnerDB').first(), #created-title not text=Tournaments created by me
  3. Each test navigates fresh — don't use beforeAll to navigate once. Each it() should call page.open() to ensure clean state and prevent test pollution.

  4. Don't expect specific data values — test data changes. Use flexible assertions:

    • expect(count).toBeGreaterThan(0) not expect(count).toBe(10)
    • expect(filteredCount).toBeLessThanOrEqual(initialCount)
    • expect(data.title?.trim().length).toBeGreaterThan(0)
  5. Session isolation: call clearSession(browser) (or page.context().clearCookies()) at the start of any test that depends on auth state.

  6. External redirects: after submitting a form that navigates to an external site, call page.waitForLoadState('domcontentloaded') before interacting with the next page. Use 30 s for waitForURL that waits for an OAuth callback.

  7. Avoid explicit waits; use waitForFunction only when necessary: Never use waitForTimeout(). Avoid waitForFunction() when simpler solutions exist:

    • await locator.waitFor({ state: 'visible' }) — wait for element to appear
    • await locator.waitFor({ state: 'hidden' }) — wait for element to disappear
    • await page.waitForURL(/param=/) — wait for URL to match pattern
    • await expect.poll(async () => getValue()).toBe(expected) — poll until assertion passes

    Why waitForFunction is bad:

    • Mixes raw DOM selectors with Playwright locators — harder to maintain
    • Bypasses Playwright's auto-waiting and retry logic
    • Often indicates you're waiting for the wrong thing (implementation detail vs user-visible change)

    Key insight: Most UI updates happen instantly without network calls. Only add waits when there's actual async behavior:

    • Tab clicks: No wait needed if tab content is already in DOM - just wait for an element on the tab
    • Client-side filters: No wait needed - results update instantly via Vue reactivity
    • Form submission with redirect: await page.waitForURL(/pattern/)
    • AJAX-loaded content: Wait for the loader to disappear or content to appear
    • Negative assertions: expect(await el.isVisible()).toBe(false) after waitForLoadState
    • Hidden input values: Prefer visible side effects, but waitForFunction is acceptable when there's no visible alternative

    Manual polling loop anti-pattern (forbidden):

    • Do not write loops like Date.now() + timeout + while (...) + waitForTimeout(...).
    • Example to avoid:
      typescript
      1const deadline = Date.now() + 8000; 2while (Date.now() < deadline) { 3 if (await ready.isVisible()) return true; 4 await page.waitForTimeout(250); 5}

    Preferred pattern (explicit steps):

    • Wait for page load once.
    • Check blockers/negative states (e.g. login prompt) explicitly.
    • Wait for one positive marker with locator.waitFor({ state: 'visible', timeout }).
  8. Use Chrome DevTools MCP to inspect DOM: Before writing locators, use take_snapshot or evaluate_script to understand actual element IDs, classes, and structure. Page controls often use <span onclick> not anchor tags.

  9. Use the test fixture: All tests must use createBrowserSuite from test-fixture.ts:

    typescript
    1import { createBrowserSuite, it, expect } from '../helpers/test-fixture'; 2 3createBrowserSuite('Suite Name', { userType: 'regular' }, (ctx) => { 4 it('test', async () => { 5 const { upcomingPage, resultsPage } = ctx.pages; 6 await upcomingPage.open(); 7 }); 8});

    Benefits:

    • Automatic tracing per test
    • Failure screenshots captured automatically
    • All page objects pre-instantiated in ctx.pages
    • Proper browser cleanup
  10. Debugging artifacts: On failure, find screenshots and traces in tests/e2e/test-results/:

    • Screenshots: {test-name}-failure-{timestamp}.png
    • Traces: {test-name}-{timestamp}.zip
    • View traces: npx playwright show-trace {trace}.zip

Page Object Pattern

Pass BrowserManager, not Page, into page objects. Do not import or type against playwright-core directly — agent-browser wraps it.

Resolve page once in BasePage's constructor so all subclasses access this.page without repeating the call:

typescript
1// tests/e2e/pages/BasePage.ts 2import { BrowserManager } from 'agent-browser/dist/browser.js'; 3 4export class BasePage { 5 protected page: ReturnType<BrowserManager['getPage']>; 6 constructor(protected browser: BrowserManager) { 7 this.page = browser.getPage(); 8 } 9 protected async navigate(path: string, options?: { waitUntil?: string }) { 10 await this.page.goto(`http://localhost:8000${path}`, options as any); 11 } 12}

Define locators as readonly class properties, not inline in methods — makes selectors easy to find and update:

typescript
1export class OrganizePage extends BasePage { 2 readonly loginRequired = this.page.locator('text=Login required'); 3 // .first() because navbar and body both contain this text 4 readonly loginButton = this.page.locator('text=Login via NetrunnerDB').first(); 5 readonly logoutButton = this.page.locator('#button-logout'); 6}

OAuth Login Helper

The loginUser(browser, 'regular' | 'admin') helper in e2e/helpers/auth.ts performs the real browser OAuth flow:

  1. Clears all browser cookies (page.context().clearCookies()) — isolates each test
  2. Navigates to /oauth2/redirect — the app redirects to NetrunnerDB
  3. Waits for the NRDB domain, fills _username / _password, submits
  4. Calls waitForLoadState('domcontentloaded') after submit to let NRDB process the login
  5. If the OAuth "Allow" form appears (first auth or re-auth), clicks it (10 s window)
  6. Waits up to 30 s for redirect back to http://localhost:8000

Call clearSession(browser) at the start of logged-out tests to ensure no leftover cookies.

Parameterized Tests

Use it.each instead of BDD Scenario Outlines:

typescript
1it.each([ 2 { filter: 'cardpool', value: 'System Gateway', expected: 15 }, 3 { filter: 'cardpool', value: 'Uprising', expected: 8 }, 4 { filter: 'type', value: 'GNK', expected: 20 }, 5])('filters by $filter = $value shows $expected results', 6 async ({ filter, value, expected }) => { 7 await resultsPage.applyFilter(filter, value); 8 expect(await resultsPage.getTournamentCount()).toBe(expected); 9 } 10);

API Mocking

typescript
1// tests/e2e/helpers/mockApi.ts 2export async function mockResultsApi(browser: BrowserManager) { 3 await browser.execute('network route "**/api/tournaments/results" --body', 4 JSON.stringify(resultsFixture)); 5}

관련 스킬

Looking for an alternative to e2e or another community skill for your workflow? Explore these related open-source skills.

모두 보기

openclaw-release-maintainer

Logo of openclaw
openclaw

Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

333.8k
0
인공지능

widget-generator

Logo of f
f

prompts.chat 피드 시스템을 위한 사용자 지정 가능한 위젯 플러그인을 생성합니다

149.6k
0
인공지능

flags

Logo of vercel
vercel

리액트 프레임워크

138.4k
0
브라우저

pr-review

Logo of pytorch
pytorch

파이썬에서 텐서와 동적 신경망 구현 및 강력한 GPU 가속 지원

98.6k
0
개발자