playwright-automation
15
总安装量
2
周安装量
#22674
全站排名
安装命令
npx skills add https://github.com/aaaaqwq/claude-code-skills --skill playwright-automation
Agent 安装分布
replit
2
openclaw
2
mcpjam
1
openhands
1
windsurf
1
zencoder
1
Skill 文档
Playwright æµè§å¨èªå¨å
æ¦è¿°
Playwright æ¯ä¸ä¸ªå¼ºå¤§çæµè§å¨èªå¨åå·¥å ·ï¼å¯ä»¥æ¨¡æçå®ç¨æ·æä½ï¼æ¯æï¼
- æ 头æµè§å¨æ¨¡å¼ï¼åå°è¿è¡ï¼
- æ°æ®ééåç¬è«
- 表åèªå¨å¡«å
- UI èªå¨åæµè¯
- æªå¾å PDF çæ
为ä»ä¹éè¦ Playwright
ä¸ browser tool çåºå«
| ç¹æ§ | browser tool | Playwright |
|---|---|---|
| éè¦ç¨æ·åä¸ | â éè¦æå¨æå¼æµè§å¨ | â å®å ¨èªå¨ |
| éå宿¶ä»»å¡ | â | â |
| åå°è¿è¡ | â | â |
| è°è¯å好 | â å¯è§åæä½ | â ï¸ éè¦æ¥å¿ |
| æ éå®è£ | â å·²éæ | â éè¦å®è£ |
使ç¨åºæ¯
ä½¿ç¨ Playwright:
- â 宿¶çæ§ï¼cron ä»»å¡ï¼
- â å¤§è§æ¨¡æ°æ®éé
- â æ 人å¼å®è¿è¡
- â ç产ç¯å¢é¨ç½²
ä½¿ç¨ browser tool:
- â 交äºå¼è°è¯
- â éè¦äººå·¥å³ççæä½
- â 䏿¬¡æ§ä»»å¡
- â ç»è¿å¤æéªè¯ç
å¿«éå¼å§
1. å®è£ Playwright
# å®è£
Python å
pip install playwright
# å®è£
æµè§å¨ï¼Chromiumï¼
playwright install chromium
# éªè¯å®è£
python3 -c "from playwright.sync_api import sync_playwright; print('â
å®è£
æå')"
2. åºæ¬ä½¿ç¨
忥 APIï¼ç®åä»»å¡ï¼
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # headless=False æ¾ç¤ºæµè§å¨
page = browser.new_page()
page.goto('https://example.com')
print(page.title())
browser.close()
弿¥ APIï¼æ¨èï¼æ§è½æ´å¥½ï¼
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto('https://example.com')
title = await page.title()
print(title)
await browser.close()
asyncio.run(main())
常ç¨åè½
1. 页é¢å¯¼èª
# çå¾
å è½½å®æ
await page.goto('https://example.com', wait_until='domcontentloaded')
# çå¾
é项ï¼
# - 'load' - 页é¢å®å
¨å è½½
# - 'domcontentloaded' - DOM å è½½å®æï¼æ´å¿«ï¼
# - 'networkidle' - ç½ç»ç©ºé²ï¼ææ
¢ä½æç¨³ï¼
2. å ç´ å®ä½
# CSS éæ©å¨
await page.click('button.submit')
await page.fill('input[name="username"]', 'myuser')
# XPath
await page.click('xpath=//button[@type="submit"]')
# ææ¬éæ©å¨
await page.click('text=ç»å½')
# ç»åéæ©å¨
await page.click('div.login-form >> text=ç»å½')
3. æåæ°æ®
# è·åææ¬
text = await page.text_content('h1.title')
# è·å屿§
href = await page.get_attribute('a.link', 'href')
# è·åå¤ä¸ªå
ç´
items = await page.query_selector_all('div.item')
for item in items:
text = await item.text_content()
print(text)
# æ§è¡ JavaScript
result = await page.evaluate('() => document.title')
# è·åæ´ä¸ª HTML
html = await page.content()
4. 表åæä½
# å¡«å表å
await page.fill('input[name="username"]', 'myuser')
await page.fill('input[name="password"]', 'mypass')
await page.click('button[type="submit"]')
# 䏿鿩
await page.select_option('select#country', 'China')
# å¤éæ¡
await page.check('input#agree')
# ä¸ä¼ æä»¶
await page.set_input_files('input[type="file"]', 'path/to/file.pdf')
5. çå¾ çç¥
# çå¾
å
ç´ åºç°
await page.wait_for_selector('div.result', timeout=5000)
# çå¾
导èª
async with page.expect_navigation():
await page.click('a.link')
# çå¾
ç¹å®æ¡ä»¶
await page.wait_for_function('() => document.title.includes("å è½½å®æ")')
# åºå®å»¶è¿
import asyncio
await asyncio.sleep(2) # çå¾
2 ç§
6. æ»å¨å交äº
# æ»å¨å°é¡µé¢åºé¨
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
# æ»å¨å°å
ç´
await page.locator('div.footer').scroll_into_view_if_needed()
# é¼ æ æ¬å
await page.hover('div.menu')
# ææ½
await page.drag_and_drop('div.draggable', 'div.dropzone')
7. æªå¾å PDF
# æªå¾
await page.screenshot(path='screenshot.png')
# å
¨é¡µæªå¾
await page.screenshot(path='full.png', full_page=True)
# å
ç´ æªå¾
await page.locator('div.content').screenshot(path='element.png')
# çæ PDF
await page.pdf(path='page.pdf', format='A4')
8. å¤çå¼¹çª
# æ¥å alert
async with page.expect_event('dialog') as dialog_info:
await page.click('button')
dialog = await dialog_info.value
await dialog.accept()
# è¾å
¥ prompt
async with page.expect_event('dialog') as dialog_info:
await page.click('button')
dialog = await dialog_info.value
await dialog.accept('my input')
åç¬çç¥
1. User-Agent è½®æ¢
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]
browser = await p.chromium.launch(
user_agent=random.choice(user_agents)
)
2. éæºå»¶è¿
import random
import asyncio
# 卿ä½ä¹é´æ·»å éæºå»¶è¿
await asyncio.sleep(random.uniform(2, 5))
3. Cookie ä¿ååå è½½
# ç¬¬ä¸æ¬¡ç»å½åä¿å Cookie
context = await browser.new_context()
await page.goto('https://example.com/login')
# ... ç»å½æä½ ...
await context.storage_state(path='cookies.json')
# åç»ä½¿ç¨ä¿åç Cookie
context = await browser.new_context(storage_state='cookies.json')
4. 代ç设置
browser = await p.chromium.launch(
proxy={
'server': 'http://proxy.example.com:8080',
'username': 'user',
'password': 'pass'
}
)
5. æµè§å¨ä¸ä¸æé离
# å建ç¬ç«çä¸ä¸æï¼ç¸å½äºæ çæ¨¡å¼ï¼
context = await browser.new_context(
viewport={'width': 1920, 'height': 1080},
user_agent='Custom UA',
locale='zh-CN'
)
page = await context.new_page()
è°è¯æå·§
1. æ¾ç¤ºæµè§å¨
# å¼å¯æå¤´æ¨¡å¼ï¼å¯ä»¥çå°æä½è¿ç¨
browser = await p.chromium.launch(headless=False, slow_mo=1000)
# slow_mo=1000 ä¼å¨æ¯ä¸ªæä½é´å»¶è¿ 1 ç§
2. æªå¾è°è¯
# å¨å
³é®æ¥éª¤æªå¾
await page.goto('https://example.com')
await page.screenshot(path='step1.png')
await page.click('button')
await page.screenshot(path='step2.png')
3. æ¥çæ¥å¿
# ç嬿§å¶å°æ¶æ¯
page.on('console', lambda msg: print(f'Console: {msg.text}'))
# çå¬ç½ç»è¯·æ±
page.on('request', lambda request: print(f'Request: {request.url}'))
page.on('response', lambda response: print(f'Response: {response.status}'))
4. Playwright Inspector
# å¯å¨ Inspector 模å¼
PWDEBUG=1 python3 your_script.py
常è§é®é¢
Q: å¦ä½å¤çéªè¯ç ï¼
A: å ç§æ¹æ¡
- ä½¿ç¨æç å¹³å°ï¼è¶ 级鹰ãè¥å¿«æç ï¼
- æå¨å¤çï¼æåçå¾ ç¨æ·è¾å ¥
- é级ï¼ç¨ browser tool è®©ç¨æ·æå¨æä½
# æ¹æ¡ 2: æå¨å¤ç
input("éå°éªè¯ç ï¼è¯·å¨æµè§å¨ä¸å®æï¼ç¶åæå车继ç»...")
await asyncio.sleep(2) # çå¾
éªè¯éè¿
Q: å ç´ æ¾ä¸å°æä¹åï¼
A: æ£æ¥ä»¥ä¸å ç¹
- æ¯å¦å¨ iframe ä¸ï¼éè¦åæ¢ï¼
- æ¯å¦å¨æå è½½ï¼éè¦çå¾ ï¼
- 鿩卿¯å¦æ£ç¡®
# åæ¢å° iframe
frame = page.frame('iframe-id')
await frame.click('button')
# çå¾
卿å è½½
await page.wait_for_selector('div.dynamic-content')
Q: å¦ä½æé«æ§è½ï¼
A:
- 使ç¨å¼æ¥ API
- å¹¶åå¤ä¸ªé¡µé¢
- åå°ä¸å¿ è¦ççå¾
# å¹¶åå¤ä¸ªé¡µé¢
async def fetch(url):
page = await browser.new_page()
await page.goto(url)
# ...
tasks = [fetch(url) for url in urls]
await asyncio.gather(*tasks)
ä¸ OpenClaw éæ
å¨ healthcare-monitor ä¸ç使ç¨
# scraper_free.py
from playwright.async_api import async_playwright
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
context = await browser.new_context(
user_agent="Mozilla/5.0 ..."
)
page = await context.new_page()
await page.goto(url)
# ... ééæ°æ® ...
await browser.close()
ä¸ browser tool é å
- Playwright â æ¥å¸¸èªå¨çæ§
- browser tool â è°è¯åå¼å¸¸å¤ç
èµæº
- 宿¹ææ¡£: https://playwright.dev/python/
- API åè: https://playwright.dev/python/docs/api/class-playwright
- 示ä¾ä»£ç :
~/clawd/skills/playwright-automation/examples/
å¿«éå½ä»¤
# å®è£
pip install playwright && playwright install chromium
# è¿è¡èæ¬
python3 script.py
# è°è¯æ¨¡å¼
PWDEBUG=1 python3 script.py
# æ¥ççæ¬
playwright --version
è®°ä½: Playwright è®©ä½ çèªå¨åä»»å¡å®å ¨æ 人å¼å®ï¼ð