视觉画布设计
canvas-design
基于设计原则创作静态视觉作品,用于海报与品牌图形。
recording-browser-flow-as-test【文档与办公】Execute a user flow step-by-step in Cursor's built-in browser while documenting each action, then emit a Playwright test that replays the same flow using stable selectors derived from the accessibility tree.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Use the browser MCP as a recorder: every navigation, click, fill, and keypress becomes a row in a script. The agent then translates that trace into a Playwright test file in the repo (or a snippet to paste into an existing spec).
This is Cursor-native because it combines browser_snapshot (refs + roles + names) with structured actions — not a separate recorder extension.
finding-dev-server-url if needed.@playwright/test). If not, add it with adding-e2e-tests or the project’s standard setup.One sentence scope, e.g. “Log in, open Settings, toggle dark mode, save.”
browser_snapshot — get the accessibility tree and element refs.
Choose the smallest interaction:
browser_click with ref from snapshot (not coordinate clicks unless required).browser_fill or browser_type for inputs.browser_select_option for selects.browser_navigate for full URL changes.Log the step in a structured list the main agent keeps:
navigate, click, fill, press, select)getByRole('button', { name: '...' })getByLabel('...')getByPlaceholder('...')getByTestId('...') if the app uses test IDs/settings”)After actions that change the DOM or navigate, take a new browser_snapshot before the next interaction.
If the flow must wait for async content, use browser_wait_for or short incremental waits per cursor-ide-browser guidance — then snapshot again.
From the final snapshot and URL, add at least:
expect(page).toHaveURL(...) or URL fragment checkEmit a test file, e.g. tests/recorded/<flow-name>.spec.ts, containing:
test.describe and test('...', async ({ page }) => { ... })await page.goto(...), await page.getByRole(...).click(), etc.npx playwright test tests/recorded/<flow-name>.spec.ts
Fix flakiness: prefer expect(locator).toBeVisible() before clicks, use toPass() retries for async lists, avoid arbitrary waitForTimeout except as last resort.
data-testid in app code if names are ambiguous.storageState — never commit secrets.