{"id":"ac707134-b7c5-46dc-902c-6bee98b1e671","shortId":"bBWFBT","kind":"skill","title":"playwright-skill","tagline":"IMPORTANT - Path Resolution: This skill can be installed in different locations (plugin system, manual installation, global, or project-specific). Before executing any commands, determine the skill directory based on where you loaded this SKILL.md file, and use that path in all c","description":"**IMPORTANT - Path Resolution:**\nThis skill can be installed in different locations (plugin system, manual installation, global, or project-specific). Before executing any commands, determine the skill directory based on where you loaded this SKILL.md file, and use that path in all commands below. Replace `$SKILL_DIR` with the actual discovered path.\n\nCommon installation paths:\n\n- Plugin system: `<plugin-root>/skills/playwright-skill`\n- Manual global: `<agent-home>/skills/playwright-skill`\n- Project-specific: `<project>/.agent/skills/playwright-skill`\n\n# Playwright Browser Automation\n\nGeneral-purpose browser automation skill. I'll write custom Playwright code for any automation task you request and execute it via the universal executor.\n\n**CRITICAL WORKFLOW - Follow these steps in order:**\n\n1. **Auto-detect dev servers** - For localhost testing, ALWAYS run server detection FIRST:\n\n   ```bash\n   cd $SKILL_DIR && node -e \"require('./lib/helpers').detectDevServers().then(servers => console.log(JSON.stringify(servers)))\"\n   ```\n\n   - If **1 server found**: Use it automatically, inform user\n   - If **multiple servers found**: Ask user which one to test\n   - If **no servers found**: Ask for URL or offer to help start dev server\n\n2. **Write scripts to /tmp** - NEVER write test files to skill directory; always use `/tmp/playwright-test-*.js`\n\n3. **Use visible browser by default** - Always use `headless: false` unless user specifically requests headless mode\n\n4. **Parameterize URLs** - Always make URLs configurable via environment variable or constant at top of script\n\n## How It Works\n\n1. You describe what you want to test/automate\n2. I auto-detect running dev servers (or ask for URL if testing external site)\n3. I write custom Playwright code in `/tmp/playwright-test-*.js` (won't clutter your project)\n4. I execute it via: `cd $SKILL_DIR && node run.js /tmp/playwright-test-*.js`\n5. Results displayed in real-time, browser window visible for debugging\n6. Test files auto-cleaned from /tmp by your OS\n\n## Setup (First Time)\n\n```bash\ncd $SKILL_DIR\nnpm run setup\n```\n\nThis installs Playwright and Chromium browser. Only needed once.\n\n## Execution Pattern\n\n**Step 1: Detect dev servers (for localhost testing)**\n\n```bash\ncd $SKILL_DIR && node -e \"require('./lib/helpers').detectDevServers().then(s => console.log(JSON.stringify(s)))\"\n```\n\n**Step 2: Write test script to /tmp with URL parameter**\n\n```javascript\n// /tmp/playwright-test-page.js\nconst { chromium } = require('playwright');\n\n// Parameterized URL (detected or user-provided)\nconst TARGET_URL = 'http://localhost:3001'; // <-- Auto-detected or from user\n\n(async () => {\n  const browser = await chromium.launch({ headless: false });\n  const page = await browser.newPage();\n\n  await page.goto(TARGET_URL);\n  console.log('Page loaded:', await page.title());\n\n  await page.screenshot({ path: '/tmp/screenshot.png', fullPage: true });\n  console.log('📸 Screenshot saved to /tmp/screenshot.png');\n\n  await browser.close();\n})();\n```\n\n**Step 3: Execute from skill directory**\n\n```bash\ncd $SKILL_DIR && node run.js /tmp/playwright-test-page.js\n```\n\n## Common Patterns\n\n### Test a Page (Multiple Viewports)\n\n```javascript\n// /tmp/playwright-test-responsive.js\nconst { chromium } = require('playwright');\n\nconst TARGET_URL = 'http://localhost:3001'; // Auto-detected\n\n(async () => {\n  const browser = await chromium.launch({ headless: false, slowMo: 100 });\n  const page = await browser.newPage();\n\n  // Desktop test\n  await page.setViewportSize({ width: 1920, height: 1080 });\n  await page.goto(TARGET_URL);\n  console.log('Desktop - Title:', await page.title());\n  await page.screenshot({ path: '/tmp/desktop.png', fullPage: true });\n\n  // Mobile test\n  await page.setViewportSize({ width: 375, height: 667 });\n  await page.screenshot({ path: '/tmp/mobile.png', fullPage: true });\n\n  await browser.close();\n})();\n```\n\n### Test Login Flow\n\n```javascript\n// /tmp/playwright-test-login.js\nconst { chromium } = require('playwright');\n\nconst TARGET_URL = 'http://localhost:3001'; // Auto-detected\n\n(async () => {\n  const browser = await chromium.launch({ headless: false });\n  const page = await browser.newPage();\n\n  await page.goto(`${TARGET_URL}/login`);\n\n  await page.fill('input[name=\"email\"]', 'test@example.com');\n  await page.fill('input[name=\"password\"]', 'password123');\n  await page.click('button[type=\"submit\"]');\n\n  // Wait for redirect\n  await page.waitForURL('**/dashboard');\n  console.log('✅ Login successful, redirected to dashboard');\n\n  await browser.close();\n})();\n```\n\n### Fill and Submit Form\n\n```javascript\n// /tmp/playwright-test-form.js\nconst { chromium } = require('playwright');\n\nconst TARGET_URL = 'http://localhost:3001'; // Auto-detected\n\n(async () => {\n  const browser = await chromium.launch({ headless: false, slowMo: 50 });\n  const page = await browser.newPage();\n\n  await page.goto(`${TARGET_URL}/contact`);\n\n  await page.fill('input[name=\"name\"]', 'John Doe');\n  await page.fill('input[name=\"email\"]', 'john@example.com');\n  await page.fill('textarea[name=\"message\"]', 'Test message');\n  await page.click('button[type=\"submit\"]');\n\n  // Verify submission\n  await page.waitForSelector('.success-message');\n  console.log('✅ Form submitted successfully');\n\n  await browser.close();\n})();\n```\n\n### Check for Broken Links\n\n```javascript\nconst { chromium } = require('playwright');\n\n(async () => {\n  const browser = await chromium.launch({ headless: false });\n  const page = await browser.newPage();\n\n  await page.goto('http://localhost:3000');\n\n  const links = await page.locator('a[href^=\"http\"]').all();\n  const results = { working: 0, broken: [] };\n\n  for (const link of links) {\n    const href = await link.getAttribute('href');\n    try {\n      const response = await page.request.head(href);\n      if (response.ok()) {\n        results.working++;\n      } else {\n        results.broken.push({ url: href, status: response.status() });\n      }\n    } catch (e) {\n      results.broken.push({ url: href, error: e.message });\n    }\n  }\n\n  console.log(`✅ Working links: ${results.working}`);\n  console.log(`❌ Broken links:`, results.broken);\n\n  await browser.close();\n})();\n```\n\n### Take Screenshot with Error Handling\n\n```javascript\nconst { chromium } = require('playwright');\n\n(async () => {\n  const browser = await chromium.launch({ headless: false });\n  const page = await browser.newPage();\n\n  try {\n    await page.goto('http://localhost:3000', {\n      waitUntil: 'networkidle',\n      timeout: 10000,\n    });\n\n    await page.screenshot({\n      path: '/tmp/screenshot.png',\n      fullPage: true,\n    });\n\n    console.log('📸 Screenshot saved to /tmp/screenshot.png');\n  } catch (error) {\n    console.error('❌ Error:', error.message);\n  } finally {\n    await browser.close();\n  }\n})();\n```\n\n### Test Responsive Design\n\n```javascript\n// /tmp/playwright-test-responsive-full.js\nconst { chromium } = require('playwright');\n\nconst TARGET_URL = 'http://localhost:3001'; // Auto-detected\n\n(async () => {\n  const browser = await chromium.launch({ headless: false });\n  const page = await browser.newPage();\n\n  const viewports = [\n    { name: 'Desktop', width: 1920, height: 1080 },\n    { name: 'Tablet', width: 768, height: 1024 },\n    { name: 'Mobile', width: 375, height: 667 },\n  ];\n\n  for (const viewport of viewports) {\n    console.log(\n      `Testing ${viewport.name} (${viewport.width}x${viewport.height})`,\n    );\n\n    await page.setViewportSize({\n      width: viewport.width,\n      height: viewport.height,\n    });\n\n    await page.goto(TARGET_URL);\n    await page.waitForTimeout(1000);\n\n    await page.screenshot({\n      path: `/tmp/${viewport.name.toLowerCase()}.png`,\n      fullPage: true,\n    });\n  }\n\n  console.log('✅ All viewports tested');\n  await browser.close();\n})();\n```\n\n## Inline Execution (Simple Tasks)\n\nFor quick one-off tasks, you can execute code inline without creating files:\n\n```bash\n# Take a quick screenshot\ncd $SKILL_DIR && node run.js \"\nconst browser = await chromium.launch({ headless: false });\nconst page = await browser.newPage();\nawait page.goto('http://localhost:3001');\nawait page.screenshot({ path: '/tmp/quick-screenshot.png', fullPage: true });\nconsole.log('Screenshot saved');\nawait browser.close();\n\"\n```\n\n**When to use inline vs files:**\n\n- **Inline**: Quick one-off tasks (screenshot, check if element exists, get page title)\n- **Files**: Complex tests, responsive design checks, anything user might want to re-run\n\n## Available Helpers\n\nOptional utility functions in `lib/helpers.js`:\n\n```javascript\nconst helpers = require('./lib/helpers');\n\n// Detect running dev servers (CRITICAL - use this first!)\nconst servers = await helpers.detectDevServers();\nconsole.log('Found servers:', servers);\n\n// Safe click with retry\nawait helpers.safeClick(page, 'button.submit', { retries: 3 });\n\n// Safe type with clear\nawait helpers.safeType(page, '#username', 'testuser');\n\n// Take timestamped screenshot\nawait helpers.takeScreenshot(page, 'test-result');\n\n// Handle cookie banners\nawait helpers.handleCookieBanner(page);\n\n// Extract table data\nconst data = await helpers.extractTableData(page, 'table.results');\n```\n\nSee `lib/helpers.js` for full list.\n\n## Custom HTTP Headers\n\nConfigure custom headers for all HTTP requests via environment variables. Useful for:\n\n- Identifying automated traffic to your backend\n- Getting LLM-optimized responses (e.g., plain text errors instead of styled HTML)\n- Adding authentication tokens globally\n\n### Configuration\n\n**Single header (common case):**\n\n```bash\nPW_HEADER_NAME=X-Automated-By PW_HEADER_VALUE=playwright-skill \\\n  cd $SKILL_DIR && node run.js /tmp/my-script.js\n```\n\n**Multiple headers (JSON format):**\n\n```bash\nPW_EXTRA_HEADERS='{\"X-Automated-By\":\"playwright-skill\",\"X-Debug\":\"true\"}' \\\n  cd $SKILL_DIR && node run.js /tmp/my-script.js\n```\n\n### How It Works\n\nHeaders are automatically applied when using `helpers.createContext()`:\n\n```javascript\nconst context = await helpers.createContext(browser);\nconst page = await context.newPage();\n// All requests from this page include your custom headers\n```\n\nFor scripts using raw Playwright API, use the injected `getContextOptionsWithHeaders()`:\n\n```javascript\nconst context = await browser.newContext(\n  getContextOptionsWithHeaders({ viewport: { width: 1920, height: 1080 } }),\n);\n```\n\n## Advanced Usage\n\nFor comprehensive Playwright API documentation, see [API_REFERENCE.md](API_REFERENCE.md):\n\n- Selectors & Locators best practices\n- Network interception & API mocking\n- Authentication & session management\n- Visual regression testing\n- Mobile device emulation\n- Performance testing\n- Debugging techniques\n- CI/CD integration\n\n## Tips\n\n- **CRITICAL: Detect servers FIRST** - Always run `detectDevServers()` before writing test code for localhost testing\n- **Custom headers** - Use `PW_HEADER_NAME`/`PW_HEADER_VALUE` env vars to identify automated traffic to your backend\n- **Use /tmp for test files** - Write to `/tmp/playwright-test-*.js`, never to skill directory or user's project\n- **Parameterize URLs** - Put detected/provided URL in a `TARGET_URL` constant at the top of every script\n- **DEFAULT: Visible browser** - Always use `headless: false` unless user explicitly asks for headless mode\n- **Headless mode** - Only use `headless: true` when user specifically requests \"headless\" or \"background\" execution\n- **Slow down:** Use `slowMo: 100` to make actions visible and easier to follow\n- **Wait strategies:** Use `waitForURL`, `waitForSelector`, `waitForLoadState` instead of fixed timeouts\n- **Error handling:** Always use try-catch for robust automation\n- **Console output:** Use `console.log()` to track progress and show what's happening\n\n## Troubleshooting\n\n**Playwright not installed:**\n\n```bash\ncd $SKILL_DIR && npm run setup\n```\n\n**Module not found:**\nEnsure running from skill directory via `run.js` wrapper\n\n**Browser doesn't open:**\nCheck `headless: false` and ensure display available\n\n**Element not found:**\nAdd wait: `await page.waitForSelector('.element', { timeout: 10000 })`\n\n## Example Usage\n\n```\nUser: \"Test if the marketing page looks good\"\n\nClaude: I'll test the marketing page across multiple viewports. Let me first detect running servers...\n[Runs: detectDevServers()]\n[Output: Found server on port 3001]\nI found your dev server running on http://localhost:3001\n\n[Writes custom automation script to /tmp/playwright-test-marketing.js with URL parameterized]\n[Runs: cd $SKILL_DIR && node run.js /tmp/playwright-test-marketing.js]\n[Shows results with screenshots from /tmp/]\n```\n\n```\nUser: \"Check if login redirects correctly\"\n\nClaude: I'll test the login flow. First, let me check for running servers...\n[Runs: detectDevServers()]\n[Output: Found servers on ports 3000 and 3001]\nI found 2 dev servers. Which one should I test?\n- http://localhost:3000\n- http://localhost:3001\n\nUser: \"Use 3001\"\n\n[Writes login automation to /tmp/playwright-test-login.js]\n[Runs: cd $SKILL_DIR && node run.js /tmp/playwright-test-login.js]\n[Reports: ✅ Login successful, redirected to /dashboard]\n```\n\n## Notes\n\n- Each automation is custom-written for your specific request\n- Not limited to pre-built scripts - any browser task possible\n- Auto-detects running dev servers to eliminate hardcoded URLs\n- Test scripts written to `/tmp` for automatic cleanup (no clutter)\n- Code executes reliably with proper module resolution via `run.js`\n- Progressive disclosure - API_REFERENCE.md loaded only when advanced features needed\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["playwright","skill","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-playwright-skill","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/playwright-skill","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 35034 github stars · SKILL.md body (13,877 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T12:51:11.173Z","embedding":null,"createdAt":"2026-04-18T20:28:12.385Z","updatedAt":"2026-04-25T12:51:11.173Z","lastSeenAt":"2026-04-25T12:51:11.173Z","tsv":"'/.agent/skills/playwright-skill':111 '/contact':627 '/dashboard':583,1525 '/lib/helpers':168,368,978 '/login':560 '/skills/playwright-skill':104,107 '/tmp':212,328,381,869,1248,1460,1562 '/tmp/desktop.png':509 '/tmp/mobile.png':523 '/tmp/my-script.js':1105,1130 '/tmp/playwright-test-':222,290,307,1254 '/tmp/playwright-test-form.js':597 '/tmp/playwright-test-login.js':532,1512,1519 '/tmp/playwright-test-marketing.js':1444,1454 '/tmp/playwright-test-page.js':386,454 '/tmp/playwright-test-responsive-full.js':798 '/tmp/playwright-test-responsive.js':463 '/tmp/quick-screenshot.png':925 '/tmp/screenshot.png':432,439,778,785 '0':701 '1':147,176,259,354 '100':484,1312 '1000':865 '10000':774,1395 '1024':835 '1080':496,829,1180 '1920':494,827,1178 '2':208,267,376,1493 '3':224,283,443,1004 '3000':689,770,1488,1502 '3001':402,472,541,606,807,921,1429,1438,1490,1504,1507 '375':517,839 '4':240,297 '5':309 '50':618 '6':321 '667':519,841 '768':833 'across':1413 'action':1315,1598 'actual':96 'ad':1077 'add':1389 'advanc':1181,1583 'alway':156,220,230,243,1219,1283,1333 'anyth':959 'api':1165,1186,1197 'api_reference.md':1189,1190,1579 'appli':1137 'applic':1592 'ask':188,198,276,1290,1636 'async':409,476,545,610,675,755,811 'authent':1078,1199 'auto':149,270,325,404,474,543,608,809,1549 'auto-clean':324 'auto-detect':148,269,403,473,542,607,808,1548 'autom':114,119,129,1059,1092,1116,1242,1340,1441,1510,1528 'automat':181,1136,1564 'avail':967,1385 'await':412,418,420,427,429,440,479,487,491,497,504,506,514,520,526,548,554,556,561,567,573,581,590,613,621,623,628,635,641,648,655,664,678,684,686,692,710,716,743,758,764,767,775,792,814,820,853,859,863,866,878,910,916,918,922,931,989,999,1009,1017,1026,1034,1144,1149,1173,1391 'backend':1063,1246 'background':1306 'banner':1025 'base':32,75 'bash':161,335,361,448,898,1086,1110,1357 'best':1193 'boundari':1644 'broken':668,702,740 'browser':113,118,227,316,347,411,478,547,612,677,757,813,909,1146,1282,1375,1545 'browser.close':441,527,591,665,744,793,879,932 'browser.newcontext':1174 'browser.newpage':419,488,555,622,685,765,821,917 'built':1542 'button':575,650 'button.submit':1002 'c':46 'case':1085 'catch':728,786,1337 'cd':162,302,336,362,449,903,1100,1125,1358,1449,1514 'check':666,946,958,1379,1462,1477 'chromium':346,388,465,534,599,672,752,800 'chromium.launch':413,480,549,614,679,759,815,911 'ci/cd':1212 'clarif':1638 'claud':1406,1467 'clean':326 'cleanup':1565 'clear':1008,1611 'click':996 'clutter':294,1567 'code':126,288,893,1225,1568 'command':27,70,89 'common':99,455,1084 'complex':954 'comprehens':1184 'configur':246,1046,1081 'consol':1341 'console.error':788 'console.log':172,372,424,435,501,584,660,735,739,781,847,874,928,991,1344 'const':387,398,410,416,464,468,477,485,533,537,546,552,598,602,611,619,671,676,682,690,698,704,708,714,751,756,762,799,803,812,818,822,843,908,914,975,987,1032,1142,1147,1171 'constant':251,1273 'context':1143,1172 'context.newpage':1150 'cooki':1024 'correct':1466 'creat':896 'criteria':1647 'critic':140,983,1215 'custom':124,286,1043,1047,1158,1229,1440,1531 'custom-written':1530 'dashboard':589 'data':1031,1033 'debug':320,1123,1210 'default':229,1280 'describ':261,1599,1615 'design':796,957 'desktop':489,502,825 'detect':150,159,271,355,393,405,475,544,609,810,979,1216,1419,1550 'detectdevserv':169,369,1221,1423,1482 'detected/provided':1267 'determin':28,71 'dev':151,206,273,356,981,1433,1494,1552 'devic':1206 'differ':13,56 'dir':93,164,304,338,364,451,905,1102,1127,1360,1451,1516 'directori':31,74,219,447,1259,1371 'disclosur':1578 'discov':97 'display':311,1384 'document':1187 'doe':634 'doesn':1376 'e':166,366,729 'e.g':1069 'e.message':734 'easier':1318 'element':948,1386,1393 'elimin':1555 'els':722 'email':565,639 'emul':1207 'ensur':1367,1383 'env':1238 'environ':248,1054,1627 'environment-specif':1626 'error':733,748,787,789,1072,1331 'error.message':790 'everi':1278 'exampl':1396 'execut':25,68,134,299,351,444,881,892,1307,1569,1594 'executor':139 'exist':949 'expert':1632 'explicit':1289 'extern':281 'extra':1112 'extract':1029 'fals':233,415,482,551,616,681,761,817,913,1286,1381 'featur':1584 'file':39,82,216,323,897,938,953,1251 'fill':592 'final':791 'first':160,333,986,1218,1418,1474 'fix':1329 'flow':530,1473 'follow':142,1320 'form':595,661 'format':1109 'found':178,187,197,992,1366,1388,1425,1431,1484,1492 'full':1041 'fullpag':433,510,524,779,872,926 'function':971 'general':116 'general-purpos':115 'get':950,1064 'getcontextoptionswithhead':1169,1175 'global':19,62,106,1080 'good':1405 'handl':749,1023,1332 'happen':1352 'hardcod':1556 'header':1045,1048,1083,1088,1095,1107,1113,1134,1159,1230,1233,1236 'headless':232,238,414,481,550,615,680,760,816,912,1285,1292,1294,1298,1304,1380 'height':495,518,828,834,840,857,1179 'help':204 'helper':968,976 'helpers.createcontext':1140,1145 'helpers.detectdevservers':990 'helpers.extracttabledata':1035 'helpers.handlecookiebanner':1027 'helpers.safeclick':1000 'helpers.safetype':1010 'helpers.takescreenshot':1018 'href':695,709,712,718,725,732 'html':1076 'http':696,1044,1051 'identifi':1058,1241 'import':4,47 'includ':1156 'inform':182 'inject':1168 'inlin':880,894,936,939 'input':563,569,630,637,1641 'instal':11,18,54,61,100,343,1356 'instead':1073,1327 'integr':1213 'intercept':1196 'javascript':385,462,531,596,670,750,797,974,1141,1170 'john':633 'john@example.com':640 'js':223,291,308,1255 'json':1108 'json.stringify':173,373 'let':1416,1475 'lib/helpers.js':973,1039 'limit':1538,1603 'link':669,691,705,707,737,741 'link.getattribute':711 'list':1042 'll':122,1408,1469 'llm':1066 'llm-optim':1065 'load':36,79,426,1580 'localhost':154,359,401,471,540,605,688,769,806,920,1227,1437,1501,1503 'locat':14,57,1192 'login':529,585,1464,1472,1509,1521 'look':1404 'make':244,1314 'manag':1201 'manual':17,60,105 'market':1402,1411 'match':1612 'messag':645,647,659 'might':961 'miss':1649 'mobil':512,837,1205 'mock':1198 'mode':239,1293,1295 'modul':1364,1573 'multipl':185,460,1106,1414 'name':564,570,631,632,638,644,824,830,836,1089,1234 'need':349,1585 'network':1195 'networkidl':772 'never':213,1256 'node':165,305,365,452,906,1103,1128,1452,1517 'note':1526 'npm':339,1361 'offer':202 'one':191,887,942,1497 'one-off':886,941 'open':1378 'optim':1067 'option':969 'order':146 'os':331 'output':1342,1424,1483,1621 'overview':1602 'page':417,425,459,486,553,620,683,763,819,915,951,1001,1011,1019,1028,1036,1148,1155,1403,1412 'page.click':574,649 'page.fill':562,568,629,636,642 'page.goto':421,498,557,624,687,768,860,919 'page.locator':693 'page.request.head':717 'page.screenshot':430,507,521,776,867,923 'page.setviewportsize':492,515,854 'page.title':428,505 'page.waitforselector':656,1392 'page.waitfortimeout':864 'page.waitforurl':582 'paramet':384 'parameter':241,391,1264,1447 'password':571 'password123':572 'path':5,43,48,86,98,101,431,508,522,777,868,924 'pattern':352,456 'perform':1208 'permiss':1642 'plain':1070 'playwright':2,112,125,287,344,390,467,536,601,674,754,802,1098,1119,1164,1185,1354 'playwright-skil':1,1097,1118 'plugin':15,58,102 'png':871 'port':1428,1487 'possibl':1547 'practic':1194 'pre':1541 'pre-built':1540 'progress':1347,1577 'project':22,65,109,296,1263 'project-specif':21,64,108 'proper':1572 'provid':397 'purpos':117 'put':1266 'pw':1087,1094,1111,1232,1235 'quick':885,901,940 'raw':1163 're':965 're-run':964 'real':314 'real-tim':313 'redirect':580,587,1465,1523 'regress':1203 'reliabl':1570 'replac':91 'report':1520 'request':132,237,1052,1152,1303,1536 'requir':167,367,389,466,535,600,673,753,801,977,1640 'resolut':6,49,1574 'respons':715,795,956,1068 'response.ok':720 'response.status':727 'result':310,699,1022,1456 'results.broken':742 'results.broken.push':723,730 'results.working':721,738 'retri':998,1003 'review':1633 'robust':1339 'run':157,272,340,966,980,1220,1362,1368,1420,1422,1435,1448,1479,1481,1513,1551 'run.js':306,453,907,1104,1129,1373,1453,1518,1576 'safe':995,1005 'safeti':1643 'save':437,783,930 'scope':1614 'screenshot':436,746,782,902,929,945,1016,1458 'script':210,255,379,1161,1279,1442,1543,1559 'see':1038,1188 'selector':1191 'server':152,158,171,174,177,186,196,207,274,357,982,988,993,994,1217,1421,1426,1434,1480,1485,1495,1553 'session':1200 'setup':332,341,1363 'show':1349,1455 'simpl':882 'singl':1082 'site':282 'skill':3,8,30,51,73,92,120,163,218,303,337,363,446,450,904,1099,1101,1120,1126,1258,1359,1370,1450,1515,1590,1606 'skill-playwright-skill' 'skill.md':38,81 'slow':1308 'slowmo':483,617,1311 'source-sickn33' 'specif':23,66,110,236,1302,1535,1628 'start':205 'status':726 'step':144,353,375,442 'stop':1634 'strategi':1322 'style':1075 'submiss':654 'submit':577,594,652,662 'substitut':1624 'success':586,658,663,1522,1646 'success-messag':657 'system':16,59,103 'tabl':1030 'table.results':1037 'tablet':831 'take':745,899,1014 'target':399,422,469,499,538,558,603,625,804,861,1271 'task':130,883,889,944,1546,1610 'techniqu':1211 'test':155,193,215,280,322,360,378,457,490,513,528,646,794,848,877,955,1021,1204,1209,1224,1228,1250,1399,1409,1470,1500,1558,1630 'test-result':1020 'test/automate':266 'test@example.com':566 'testus':1013 'text':1071 'textarea':643 'time':315,334 'timeout':773,1330,1394 'timestamp':1015 'tip':1214 'titl':503,952 'token':1079 'top':253,1276 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'track':1346 'traffic':1060,1243 'treat':1619 'tri':713,766,1336 'troubleshoot':1353 'true':434,511,525,780,873,927,1124,1299 'try-catch':1335 'type':576,651,1006 'univers':138 'unless':234,1287 'url':200,242,245,278,383,392,400,423,470,500,539,559,604,626,724,731,805,862,1265,1268,1272,1446,1557 'usag':1182,1397 'use':41,84,179,221,225,231,935,984,1056,1139,1162,1166,1231,1247,1284,1297,1310,1323,1334,1343,1506,1588,1604 'user':183,189,235,396,408,960,1261,1288,1301,1398,1461,1505 'user-provid':395 'usernam':1012 'util':970 'valid':1629 'valu':1096,1237 'var':1239 'variabl':249,1055 'verifi':653 'via':136,247,301,1053,1372,1575 'viewport':461,823,844,846,876,1176,1415 'viewport.height':852,858 'viewport.name':849 'viewport.name.tolowercase':870 'viewport.width':850,856 'visibl':226,318,1281,1316 'visual':1202 'vs':937 'wait':578,1321,1390 'waitforloadst':1326 'waitforselector':1325 'waitforurl':1324 'waituntil':771 'want':264,962 'width':493,516,826,832,838,855,1177 'window':317 'without':895 'won':292 'work':258,700,736,1133 'workflow':141,1596 'wrapper':1374 'write':123,209,214,285,377,1223,1252,1439,1508 'written':1532,1560 'x':851,1091,1115,1122 'x-automated-bi':1090,1114 'x-debug':1121","prices":[{"id":"7b8e4230-1115-4144-a03b-b9e5fe640212","listingId":"ac707134-b7c5-46dc-902c-6bee98b1e671","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:28:12.385Z"}],"sources":[{"listingId":"ac707134-b7c5-46dc-902c-6bee98b1e671","source":"github","sourceId":"sickn33/antigravity-awesome-skills/playwright-skill","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/playwright-skill","isPrimary":false,"firstSeenAt":"2026-04-18T21:42:28.871Z","lastSeenAt":"2026-04-25T12:51:11.173Z"},{"listingId":"ac707134-b7c5-46dc-902c-6bee98b1e671","source":"skills_sh","sourceId":"sickn33/antigravity-awesome-skills/playwright-skill","sourceUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/playwright-skill","isPrimary":true,"firstSeenAt":"2026-04-18T20:28:12.385Z","lastSeenAt":"2026-04-25T12:40:18.269Z"}],"details":{"listingId":"ac707134-b7c5-46dc-902c-6bee98b1e671","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"playwright-skill","github":{"repo":"sickn33/antigravity-awesome-skills","stars":35034,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-25T06:33:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"4c90365cbdb835fcf7f131009bc8a21eded4c7b2","skill_md_path":"skills/playwright-skill/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/playwright-skill"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"playwright-skill","description":"IMPORTANT - Path Resolution: This skill can be installed in different locations (plugin system, manual installation, global, or project-specific). Before executing any commands, determine the skill directory based on where you loaded this SKILL.md file, and use that path in all commands below."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/playwright-skill"},"updatedAt":"2026-04-25T12:51:11.173Z"}}