E2E
sendou-ink/sendou.ink
Run, debug, and manage Playwright e2e tests. An agent skill from sendou-ink/sendou.ink.
Writes Playwright e2e tests for ComfyUIfrontend. An agent skill from Comfy-Org/ComfyUI_frontend.
$ npx skills add Comfy-Org/ComfyUI_frontend --skill writing-playwright-tests -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Comfy-Org/ComfyUI_frontend writing-playwright-tests --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Comfy-Org/ComfyUI_frontend.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/writing-playwright-tests .claude/skills/writing-playwright-tests && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "writing-playwright-tests" agent skill from https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/.claude/skills/writing-playwright-tests into .claude/skills/writing-playwright-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-playwright-tests", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/.claude/skills/writing-playwright-testsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Comfy-Org/ComfyUI_frontend --skill writing-playwright-tests -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Comfy-Org/ComfyUI_frontend writing-playwright-tests --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Comfy-Org/ComfyUI_frontend.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/writing-playwright-tests .agents/skills/writing-playwright-tests && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "writing-playwright-tests" agent skill from https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/.claude/skills/writing-playwright-tests into .agents/skills/writing-playwright-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-playwright-tests", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Comfy-Org/ComfyUI_frontend --skill writing-playwright-tests -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Comfy-Org/ComfyUI_frontend writing-playwright-tests --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Comfy-Org/ComfyUI_frontend.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/writing-playwright-tests .cursor/skills/writing-playwright-tests && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "writing-playwright-tests" agent skill from https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/.claude/skills/writing-playwright-tests into .cursor/skills/writing-playwright-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-playwright-tests", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Comfy-Org/ComfyUI_frontend.git --path .claude/skills/writing-playwright-tests--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Comfy-Org/ComfyUI_frontend --skill writing-playwright-tests -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Comfy-Org/ComfyUI_frontend writing-playwright-tests --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Comfy-Org/ComfyUI_frontend.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/writing-playwright-tests .gemini/skills/writing-playwright-tests && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "writing-playwright-tests" agent skill from https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/.claude/skills/writing-playwright-tests into .gemini/skills/writing-playwright-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-playwright-tests", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Comfy-Org/ComfyUI_frontend writing-playwright-testsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Comfy-Org/ComfyUI_frontend --skill writing-playwright-tests -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Comfy-Org/ComfyUI_frontend.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/writing-playwright-tests .github/skills/writing-playwright-tests && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "writing-playwright-tests" agent skill from https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/.claude/skills/writing-playwright-tests into .github/skills/writing-playwright-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-playwright-tests", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Comfy-Org/ComfyUI_frontend --skill writing-playwright-tests -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Comfy-Org/ComfyUI_frontend writing-playwright-tests --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Comfy-Org/ComfyUI_frontend.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/writing-playwright-tests .opencode/skills/writing-playwright-tests && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "writing-playwright-tests" agent skill from https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/.claude/skills/writing-playwright-tests into .opencode/skills/writing-playwright-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-playwright-tests", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
writing-playwright-testsWrites Playwright e2e tests for ComfyUIfrontend. An agent skill from Comfy-Org/ComfyUI_frontend.
Writing Playwright Tests is an agent skill from Comfy-Org/ComfyUI_frontend. Writes Playwright e2e tests for ComfyUIfrontend. Use when creating, modifying, or debugging browser tests. Triggers on: playwright, e2e test, browser test, spec file.
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Browser testing, Diffusion and image models and End-to-end testing. It works with Playwright, ComfyUI and Vue.js. The repository describes itself as: Official front-end implementation of ComfyUI. The licence is GPL-3.0.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit f9be289. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Writing Playwright Tests loads about 2.3k tokens when it runs. Until then it costs about 48 tokens; SKILL.md has 632 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Comfy-Org/ComfyUI_frontend at commit f9be289, republished under its GPL-3.0 licence (© Comfy-Org). 632 words, ~2,336 tokens.
.claude/skills/writing-playwright-tests/SKILL.md (or your agent's skills folder).The design rules that apply at every test level (behavioral assertions,
lowest proving level, table-driven variants, isolation, no sleeps) are in
docs/guidance/testing-principles.md. This skill covers the Playwright and
ComfyUI mechanics.
ALWAYS look at existing tests first. Search browser_tests/tests/ for similar patterns before writing new tests.
ALWAYS read the fixture code. The APIs are in browser_tests/fixtures/ - read them directly instead of guessing.
Use premade JSON workflow assets instead of building workflows programmatically.
browser_tests/assets/await comfyPage.workflow.loadWorkflow('feature/my_workflow')browser_tests/assets/default.json and manually editing the JSON to match your desired graph stateSeed starting settings with test.use({ initialSettings }). The main
fixture replaces backend settings before every test; do not add settings
resets in afterEach. Keep runtime setters for changes under test. Nested
test.use replaces the parent's settings object, so include inherited
overrides. See Starting settings and isolation.
Choose based on what you're testing, not personal preference:
| Testing... | Use | Why |
|---|---|---|
| Vue-rendered node UI, DOM widgets, CSS states | comfyPage.vueNodes.* | Nodes are DOM elements, use locators |
| Canvas interactions, connections, legacy nodes | comfyPage.nodeOps.* | Canvas-based, use coordinates/references |
| Both in same test | Pick primary, minimize switching | Avoid confusion |
Always add { tag: '@vue-nodes' } to the test or test.describe when it needs
Vue Nodes. The fixture enables the renderer before boot and waits for the nodes.
Never manually set Comfy.VueNodes.Enabled, including through initialSettings,
or call comfyPage.vueNodes.waitForNodes() in tests.
Vue Node state uses CSS classes:
const BYPASS_CLASS = /before:bg-bypass\/60/
await expect(node).toHaveClass(BYPASS_CLASS)These are frequent causes of flaky tests - check them first, but investigate if they don't apply:
| Symptom | Common Cause | Typical Fix |
|---|---|---|
| Test passes locally, fails in CI | Missing nextFrame() | Add await comfyPage.nextFrame() after canvas ops (not needed after loadWorkflow()) |
| Keyboard shortcuts don't work | Missing focus | Add await comfyPage.canvas.click() first |
| Double-click doesn't trigger | Timing too fast | Add { delay: 5 } option |
| Elements end up in wrong position | Drag animation incomplete | Use { steps: 10 } not { steps: 1 } |
| Widget value wrong after drag-drop | Upload incomplete | Add { waitForUpload: true } |
| Test fails when run with others | Test pollution | Add afterEach with resetView() |
| Local screenshots don't match CI | Platform differences | Screenshots are Linux-only, use PR label |
subtree intercepts pointer events | Canvas overlay (z-999) | Use dispatchEvent on the DOM element to bypass overlay |
| Context menu empty / wrong items | Node not selected | Select node first: vueNodes.selectNode() or nodeRef.click('title') |
navigateIntoSubgraph timeout | Node too small in asset | Use node size [400, 200] minimum in test asset JSON |
Add appropriate tags to every test:
| Tag | When to Use |
|---|---|
@smoke | Quick essential tests |
@slow | Tests > 10 seconds |
@screenshot | Visual regression tests |
@canvas | Canvas interactions |
@node | Node-related |
@widget | Widget-related |
@mobile | Mobile viewport (runs on Pixel 5 project) |
@2x | HiDPI tests (runs on 2x scale project) |
test.describe('Feature', { tag: ['@screenshot', '@canvas'] }, () => {Never use waitForTimeout - it's always wrong.
| Pattern | Use Case |
|---|---|
| Auto-retrying assertions | toBeVisible(), toHaveText(), etc. (prefer these) |
expect.poll() | Single value polling |
expect().toPass() | Multiple assertions that must all pass |
// Prefer auto-retrying assertions when possible
await expect(node).toBeVisible()
// Single value polling
await expect.poll(() => widget.getValue(), { timeout: 2000 }).toBe(100)
// Multiple conditions
await expect(async () => {
expect(await node1.getValue()).toBe('foo')
expect(await node2.getValue()).toBe('bar')
}).toPass({ timeout: 2000 })New Browser Test Expectationsawait expect(comfyPage.canvas).toHaveScreenshot('page.png', {
mask: [page.locator('.timestamp')]
})pnpm dlx playwright show-trace trace.zipCI=true pnpm test:browserpnpm test:browser:localAvoid these common mistakes:
Arbitrary waits - Use retrying assertions instead
// ❌ await page.waitForTimeout(500)
// ✅ await expect(element).toBeVisible()Implementation-tied selectors - Use test IDs or semantic selectors
// ❌ page.locator('div.container > button.btn-primary')
// ✅ page.getByTestId('submit-button')Missing nextFrame after canvas ops - Canvas needs sync time
await node.drag({ x: 50, y: 50 })
await comfyPage.nextFrame() // RequiredShared state between tests - Tests must be independent
// ❌ let sharedData // Outside test
// ✅ Define state inside each test// Path depends on test file location - adjust '../' segments accordingly
import {
comfyPageFixture as test,
comfyExpect as expect
} from '../fixtures/ComfyPage'
test.describe('FeatureName', { tag: ['@canvas'] }, () => {
test.afterEach(async ({ comfyPage }) => {
await comfyPage.canvasOps.resetView()
})
test('should do something', async ({ comfyPage }) => {
await comfyPage.workflow.loadWorkflow('myWorkflow')
const node = (await comfyPage.nodeOps.getNodeRefsByTitle('KSampler'))[0]
// ... test logic
await expect(comfyPage.canvas).toHaveScreenshot('expected.png')
})
})# Find similar tests
grep -r "KSampler" browser_tests/tests/
# Find usage of a fixture method
grep -r "loadWorkflow" browser_tests/tests/
# Find tests with specific tag
grep -r '@screenshot' browser_tests/tests/| Purpose | Path |
|---|---|
| Main fixture | browser_tests/fixtures/ComfyPage.ts |
| Helper classes | browser_tests/fixtures/helpers/ |
| Component objects | browser_tests/fixtures/components/ |
| Test selectors | browser_tests/fixtures/selectors.ts |
| Vue Node helpers | browser_tests/fixtures/VueNodeHelpers.ts |
| Test assets | browser_tests/assets/ |
| Existing tests | browser_tests/tests/ |
Read the fixture code directly - it's the source of truth for available methods.
© Comfy-Org, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/writing-playwright-tests of Comfy-Org/ComfyUI_frontend.
Open the folder on GitHubat commit f9be289
Writing Playwright Tests next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Writing Playwright Tests this skillComfy-Org/ComfyUI_frontend | 2.1k | — | ~2.3k | Automated safety check: Pass | GPL-3.0 | |
| E2Esendou-ink/sendou.ink | 297 | — | ~2.1k | Automated safety check: Notes | AGPL-3.0 | |
| E2E Tests Studiomastra-ai/mastra | 29k | — | ~4.3k | Automated safety check: Pass | Custom licence | |
| Replica TestJakeschincariol/replica-skill | 1.2k | — | ~819 | Automated safety check: Pass | MIT | |
| Debug E2E Testbitovi/ai-enablement-prompts | 121 | — | ~677 | Automated safety check: Pass | MIT | |
| Awt E2E Testingsickn33/agentic-awesome-skills | 47k | 2 repos | ~556 | Automated safety check: Pass | MIT |
sendou-ink/sendou.ink
Run, debug, and manage Playwright e2e tests. An agent skill from sendou-ink/sendou.ink.
mastra-ai/mastra
REQUIRED when modifying any file in packages/playground-ui or packages/playground.
Jakeschincariol/replica-skill
Clicks through every flow of an app clone and tests it for bugs: a test plan generated from the recon flows with happy paths and edge cases, Playwright end-to-end tests where possible, a browser…
bitovi/ai-enablement-prompts
Debug and fix failing Playwright E2E tests. An agent skill from bitovi/ai-enablement-prompts.
sickn33/agentic-awesome-skills
AI-powered E2E web testing — eyes and hands for AI coding tools.
JetBrains/skills
A skill your agent uses for Vue.js testing. An agent skill from JetBrains/skills.
Comfy-Org/ComfyUI_frontend
Adds deprecation warnings for renamed or removed properties/APIs.
Comfy-Org/ComfyUI_frontend
Replay recorded agent conversations as Playwright tests against the real chat panel and canvas.
Comfy-Org/ComfyUI_frontend
Transforms raw Playwright codegen output into ComfyUI convention-compliant tests.
Comfy-Org/ComfyUI_frontend
Dispatches the comment-sicko subagent to hunt gratuitous comments in a PR/diff, triages its raw findings, and posts a polite, professional writeup.
Comfy-Org/ComfyUI_frontend
Diagnoses and fixes flaky Playwright e2e tests by replacing race-prone patterns with retry-safe alternatives.
Comfy-Org/ComfyUI_frontend
Ships performance fixes with CI-proven improvement using stacked PRs.
Works with
Categories
Writes Playwright e2e tests for ComfyUIfrontend. An agent skill from Comfy-Org/ComfyUI_frontend. Writing Playwright Tests is an agent skill from Comfy-Org/ComfyUI_frontend. Writes Playwright e2e tests for ComfyUIfrontend.
Writing Playwright Tests fits situations like: debugging browser tests; tasks that involve Browser testing; tasks that involve Diffusion and image models.
Run `npx skills add Comfy-Org/ComfyUI_frontend --skill writing-playwright-tests -a claude-code`. Or copy the skill folder (.claude/skills/writing-playwright-tests in Comfy-Org/ComfyUI_frontend) into .claude/skills/writing-playwright-tests in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Comfy-Org/ComfyUI_frontend --skill writing-playwright-tests -a codex`. Or copy the skill folder (.claude/skills/writing-playwright-tests in Comfy-Org/ComfyUI_frontend) into .agents/skills/writing-playwright-tests in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Comfy-Org/ComfyUI_frontend --skill writing-playwright-tests -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/writing-playwright-tests, .gemini/skills/writing-playwright-tests, .github/skills/writing-playwright-tests and .opencode/skills/writing-playwright-tests in your project.
Going by SKILL.md and its folder, Writing Playwright Tests needs the command-line tools its instructions call (pnpm).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Writing Playwright Tests is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.3k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Writing Playwright Tests: E2E (sendou-ink/sendou.ink, 297 stars), E2E Tests Studio (mastra-ai/mastra, 29k stars), Replica Test (Jakeschincariol/replica-skill, 1.2k stars) and Debug E2E Test (bitovi/ai-enablement-prompts, 121 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Comfy-Org (a GitHub organization) maintains it in Comfy-Org/ComfyUI_frontend, which has 2,056 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on October 9, 2026.
Source: Comfy-Org/ComfyUI_frontend on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.