webapp-testing
npx skills add https://github.com/icartsh/icartsh_plugin --skill webapp-testing
Agent 安装分布
Skill 文档
Web Application Testing
ë¡ì»¬ ì¹ ì í리ì¼ì´ì ì í ì¤í¸íë ¤ë©´ íì´ì¬(Python) Playwright ì¤í¬ë¦½í¸ë¥¼ ìì±íì¸ì.
ì¬ì© ê°ë¥í í¬í¼ ì¤í¬ë¦½í¸:
scripts/with_server.py– ìë² ë¼ì´íì¬ì´í´ ê´ë¦¬ (ë¤ì¤ ìë² ì§ì)
íì ì¤í¬ë¦½í¸ë¥¼ --helpì í¨ê» 먼ì ì¤ííì¬ ì¬ì©ë²ì íì¸íì¸ì. ì¤í¬ë¦½í¸ë¥¼ ì§ì ì¤íí´ë³´ê³ 커ì¤í
ì루ì
ì´ ì ëì ì¼ë¡ íìíë¤ê³ íë¨ë기 ì ê¹ì§ë ìì¤ ì½ë를 ì½ì§ ë§ì¸ì. ì´ë¬í ì¤í¬ë¦½í¸ë¤ì ë§¤ì° ë°©ëíì¬ ì»¨í
ì¤í¸ ìëì°ë¥¼ ì¤ì¼ìí¬ ì ììµëë¤. ì´ë¤ì 컨í
ì¤í¸ì ë´ê¸°ë³´ë¤ë ë¸ëë°ì¤(black-box) ì¤í¬ë¦½í¸ë¡ ì§ì í¸ì¶íëë¡ ë§ë¤ì´ì¡ìµëë¤.
ê²°ì í¸ë¦¬: ì ê·¼ ë°©ì ì í (Decision Tree)
ì¬ì©ì ìì
â ì ì HTMLì¸ê°?
ââ ì â HTML íì¼ì ì§ì ì½ì´ ì
ë í°(selectors) ìë³
â ââ ì±ê³µ â ìë³ë ì
ë í°ë¡ Playwright ì¤í¬ë¦½í¸ ìì±
â ââ ì¤í¨/ë¶ì¶©ë¶ â ëì ì±ì¼ë¡ ê°ì£¼ (ìë 참조)
â
ââ ìëì¤ (ëì ì¹ì±) â ìë²ê° ì´ë¯¸ ì¤í ì¤ì¸ê°?
ââ ìëì¤ â ì¤í: python scripts/with_server.py --help
â ê·¸ë¤ì í¬í¼ë¥¼ ì¬ì©íì¬ ê°ìíë Playwright ì¤í¬ë¦½í¸ ìì±
â
ââ ì â ì ì°° í íë(Reconnaissance-then-action):
1. ì´ë(Navigate) í networkidle ìíê¹ì§ ë기
2. ì¤í¬ë¦°ì· ìº¡ì² ëë DOM ê²ì¬
3. ë ëë§ë ìíìì ì
ë í° ìë³
4. ì°¾ì ì
ë í°ë¡ ìì
ìí
ìì: with_server.py ì¬ì©
ìë²ë¥¼ ììíë ¤ë©´ 먼ì --help를 ì¤íí ë¤ì í¬í¼ë¥¼ ì¬ì©íì¸ì:
ë¨ì¼ ìë²:
python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py
ë¤ì¤ ìë² (ì: ë°±ìë + íë°í¸ìë):
python scripts/with_server.py \
--server "cd backend && python server.py" --port 3000 \
--server "cd frontend && npm run dev" --port 5173 \
-- python your_automation.py
ìëí ì¤í¬ë¦½í¸ë¥¼ ìì±í ëë Playwright ë¡ì§ë§ í¬í¨íì¸ì (ìë²ë ìëì¼ë¡ ê´ë¦¬ë©ëë¤):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # íì chromiumì headless 모ëë¡ ì¤ííì¸ì
page = browser.new_page()
page.goto('http://localhost:5173') # ìë²ë ì´ë¯¸ ì¤íëì´ ì¤ë¹ë ìíì
ëë¤
page.wait_for_load_state('networkidle') # ë§¤ì° ì¤ì: JSê° ì¤íë ëê¹ì§ ë기íì¸ì
# ... ìëí ë¡ì§ ìì±
browser.close()
ì ì°° í íë í¨í´ (Reconnaissance-Then-Action Pattern)
-
ë ëë§ë DOM ê²ì¬:
page.screenshot(path='/tmp/inspect.png', full_page=True) content = page.content() page.locator('button').all() -
ê²ì¬ ê²°ê³¼ìì ì ë í° ìë³
-
ì°¾ì ì ë í°ë¥¼ ì¬ì©íì¬ ìì ì¤í
주ìí´ì¼ í í¨ì
â ëì¨: ëì ì±ìì networkidle ìí를 기ë¤ë¦¬ì§ ìê³ DOMì ê²ì¬íë ê²
â
ì¢ì: ê²ì¬ ì ì page.wait_for_load_state('networkidle')를 í¸ì¶íì¬ ë기íë ê²
ëª¨ë² ì¬ë¡ (Best Practices)
- ë²ë¤ë§ë ì¤í¬ë¦½í¸ë¥¼ ë¸ëë°ì¤ë¡ íì©íì¸ì – ìì
ì ìíí ë
scripts/ì ìë ì¤í¬ë¦½í¸ê° ëìì´ ë ì ìëì§ ê³ ë ¤íì¸ì. ì´ ì¤í¬ë¦½í¸ë¤ì 컨í ì¤í¸ ìëì°ë¥¼ ì´ì§ë½íì§ ìì¼ë©´ì ë³µì¡í ì¼ë° ìí¬íë¡ì°ë¥¼ ìì ì ì¼ë¡ ì²ë¦¬í©ëë¤.--helpë¡ ì¬ì©ë²ì íì¸í í ì§ì í¸ì¶íì¸ì. - ë기ì ì¤í¬ë¦½í¸ìë
sync_playwright()를 ì¬ì©íì¸ì. - ìì ì´ ëëë©´ íì ë¸ë¼ì°ì 를 ë«ì¼ì¸ì.
- ì¤ëª
ì ì¸ ì
ë í°ë¥¼ ì¬ì©íì¸ì:
text=,role=, CSS ì ë í° ëë ID. - ì ì í ë기 ìê°ì ì¶ê°íì¸ì:
page.wait_for_selector()ëëpage.wait_for_timeout().
참조 íì¼ (Reference Files)
- examples/ – ì¼ë°ì ì¸ í¨í´ì ë³´ì¬ì£¼ë ìì:
element_discovery.py– íì´ì§ ë´ ë²í¼, ë§í¬ ë° ì ë ¥ íë 찾기static_html_automation.py– ë¡ì»¬ HTMLì file:// URL ì¬ì©í기console_logging.py– ìëí ì¤ ì½ì ë¡ê·¸ 캡ì²í기