Loading...
Loading...
Cài + dùng Playwright bằng standalone .mjs script (không qua npx playwright test / *.spec.ts) để verify code nhanh, một lần: chụp ảnh localhost/file://, đọc console/pageerror, đo getBoundingClientRect khi phần tử không thấy/không bấm được, auth bypass qua addCookies+addInitScript; việc NHIỀU BƯỚC thì mode phiên bền connectOverCDP (tab/cookie giữ nguyên giữa các lượt, không viết mù cả kịch bản). Dùng khi user nói 'verify bằng playwright', 'chụp ảnh trang', 'test nhanh UI bằng script', 'verify nhiều bước', 'giữ session giữa các lần chạy', 'claude-in-chrome bị chặn localhost', 'không click được / không thấy phần tử', hoặc invoke /playwright-verify. KHÁC uat-nonit-testcase (bộ test case UAT cho non-IT) và claude-in-chrome (extension, bị chặn localhost/file://) — đây là hướng dẫn CHUNG áp dụng mọi task.
npx skill4agent add rheinmir/setup playwright-verifylocalhostfile://claude-in-chrome.mjsnodelocalhostfile://connectOverCDPclaude-in-chromeFrame with ID 0 is showing error pageCan't interact with browser-internal or unparseable URLslocalhost:*file://getBoundingClientRectgetComputedStyle*.spec.ts/playwright-verify*.spec.tsnpx playwright testgiả thuyết cần verify → (đã cài?) → script .mjs một-phát: launch → gắn 4 kênh lỗi → goto (load + wait) → screenshot/đo → close → đọc log + ảnh → vứtmột Chrome CDP riêng (profile tạm) ← mỗi lượt step-N.mjs bám vào, state sống giữa các lượt → pkill khi xong| Field | Required? | Ý nghĩa | |
|---|---|---|---|
| In | URL ( | có | trang cần verify |
| In | project có | có | script phải chạy TỪ thư mục đó (hoặc |
| In | cookie/localStorage dev-login | không | cho auth bypass |
| Out | ảnh chụp (vd | có | bằng chứng; ảnh sạch một mình KHÔNG đủ |
| Out | số đo | khi chẩn đoán phần tử | số thật thay vì đoán từ ảnh |
| Out | "xong" | — | giả thuyết xác nhận/bác bỏ bằng log + ảnh; script đã dọn; Chrome CDP (nếu có) đã |
import { chromium } from "@playwright/test"@playwright/testnode_modulescwd/tmpcpNODE_PATHwaitUntil: "networkidle"waitUntil: "load"page.waitForTimeout(N)context.addCookies([{url, name, value}])urldomainpathcontext.addInitScript(...)localStoragenewPage()contextpage.evaluate(() => el.getBoundingClientRect())getComputedStyle(el)locator.click()consoleerrorpageerrorresponsestatus() >= 400requestfailedpagegotopage.on("response", r => { if (r.status() >= 400) console.log("[http]", r.status(), r.url()); });
page.on("requestfailed", r => console.log("[reqfail]", r.failure()?.errorText, r.url()));--user-data-dir--remote-debugging-portnpx playwright install@playwright/testNODE_PATHnetworkidleloadwaitForTimeoutlocator.click()| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | deterministic | máy | Kiểm đã cài ( | binary sẵn | CDN bị chặn → blocked |
| W02 | judgment | giả thuyết + URL | Viết 1 file | script | — |
| W03 | effect | script | Chạy từ đúng thư mục ( | log + ảnh | resolve lỗi → cp/NODE_PATH, lặp W03 |
| W04 | effect | việc nhiều bước | Mode phiên bền | state giữ giữa lượt | xong → |
ls ~/Library/Caches/ms-playwrightpnpm add -D @playwright/testdevDependenciesnpx playwright install chromiumnpx playwright installcdn.playwright.dev.mjsnodenpx playwright testimport { chromium } from "@playwright/test"; // export chromium dùng được như package "playwright"
const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1400, height: 900 } });
page.on("console", m => console.log("[console]", m.type(), m.text()));
page.on("pageerror", e => console.log("[pageerror]", e.message));
await page.goto("http://localhost:3000/some-page", { waitUntil: "load" }); // KHÔNG "networkidle" — xem Rules #2
await page.waitForTimeout(1500);
await page.screenshot({ path: "/tmp/check.png", fullPage: true });
await browser.close();node check.mjs.mjslocalStorage# một lần — Chrome riêng, profile riêng; KHÔNG bám vào Chrome cá nhân của user
CH="$HOME/Library/Caches/ms-playwright/chromium-1243/chrome-mac-arm64/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"
"$CH" --remote-debugging-port=9333 --user-data-dir=/tmp/pw-prof --headless=new --no-first-run about:blank &// mỗi lượt — step-N.mjs
import { chromium } from "@playwright/test";
const browser = await chromium.connectOverCDP("http://localhost:9333");
const ctx = browser.contexts()[0];
const page = ctx.pages()[0] ?? await ctx.newPage(); // bám tab cũ, KHÔNG launch mới
// ... một hành động + quan sát; state sống sang lượt sau ...
await browser.close(); // chỉ ngắt kết nối, Chrome vẫn chạypkill -f "remote-debugging-port=9333"file://connectOverCDPwindow.__marker.mjs| ID | Kind | Guard | Hành vi | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | conditional_required | việc NHIỀU BƯỚC có điều kiện (cần nhìn rồi mới quyết bước kế) | một Chrome riêng | việc một-phát → skip; không bao giờ bám Chrome cá nhân | kết thúc bằng |
| B02 | user_optional | trang cần dev-login/session giả | | — | W03 |
| B03 | recovery | phần tử "không thấy/không bấm được" | | — | W03 |
pkillFrame with ID 0 is showing error pagehttp://localhost:3000/some-pagecheck.mjsnode check.mjs/tmp/check.png[console][pageerror][http][reqfail]waitUntil: "networkidle"waitUntil: "load"page.waitForTimeout(1500)[http] 500 /api/x