playwright的python文檔
安裝
pip install playwright
# 安裝驅(qū)動(dòng), 支持的瀏覽器:cr, chromium, ff, firefox, wk 和 webkit
playwright install
控制臺(tái)啟動(dòng)錄制
playwright codegen [options] [url]
- -o, --output :保存生成腳本
- –target :生成的腳本語(yǔ)言,可以設(shè)置javascript, test, python, python-async和csharp,默認(rèn)為python
- -b, --browser :要使用的瀏覽器,可以選擇cr, chromium, ff, firefox, wk和webkit,默認(rèn)chromium。
- –channel :chromium版本,比如chrome, chrome-beta, msedge-dev等
- –color-scheme :模擬器的顏色主題,可選擇light 或者 dark樣式
- –device :模擬的設(shè)備
- –save-storage :保存上下文狀態(tài),用于保存cookies 和localStorage,可用它來(lái)實(shí)現(xiàn)重用。例如playwright codegen --save-storage=auth.json
- –load-storage :加載–save-storage 保存的數(shù)據(jù),重用認(rèn)證數(shù)據(jù)。
- –proxy-server :指定代理服務(wù)器
- –timezone
- –geolocation :指定地理位置坐標(biāo)
- –lang :指定語(yǔ)言/地區(qū),比如中國(guó)大陸:zh-CN
- –timeout :超時(shí)時(shí)間,定位毫秒,默認(rèn)10000ms
- –user-agent :用戶代理
- –viewport-size :瀏覽器窗口大小
- -h, --help :查看幫助信息
例如:
playwright codegen -o test_playwright.py --target python -b chromium --device="iPhone 12 Pro" https://www.baidu.com/
playwright open https://www.baidu.com/ # 默認(rèn)使用Chromium打開(kāi)
playwright wk https://www.baidu.com/ # 使用WebKit打開(kāi)
playwright open --device="iPhone 12 Pro" https://www.baidu.com/ # 使用iPhone 12 Pro模擬器打開(kāi)
基本用法
常見(jiàn)配置參數(shù)
headless,slow_mo,viewport,locale,timezone,color_scheme,geolocation,user_agent, timeout, proxy
同步模式
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 創(chuàng)建一個(gè)瀏覽器實(shí)例; headless:是否無(wú)頭;slow_mo放慢執(zhí)行速度
# pixel_2 = playwright.devices['Pixel 2'] # Pixel 2 一款安卓手機(jī)
proxy_ip = {
'server': 'http://',
'username': '',
'password': '',
}
browser = p.chromium.launch(headless=False, slow_mo=100, proxy=proxy_ip)
context = browser.new_context(
viewport={'width': 1800, 'height': 800}, # 窗口大小
locale='zh-CN', #語(yǔ)言zh-CN/en-EN
timezone='Europe/Rome', #時(shí)區(qū)
color_scheme='dark', # 顏色
geolocation={"longitude": 48.858455, "latitude": 2.294474} # 地理位置
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', # 瀏覽器,
timeout=10000, # 超時(shí)
# **pixel_2,
)
# 創(chuàng)建兩個(gè)瀏覽器上下文
page = browser.new_page()
page.goto('http://www.baidu.com')
print(page.title)
browser.close()
異步模式
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto("http://www.baidu.com")
print(await page.title())
await browser.close()
asyncio.run(main())
防止WebDriver 被檢測(cè)
js = """
Object.defineProperties(navigator,{webdriver:{get:()=>undefined}};
"""
page.add_init_script(js)
或者
page.add_init_script("""Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});""")
獲取源碼,文本,屬性
獲取源碼: .content()
page.wait_for_load_state('networkidle')
html = page.content()
獲取文本: .text_content()
# ul->li下
brand = element.query_selector('text=品牌:').text_content()
name = ele_items.query_selector('section > div._3KXtu._3jY37 > a').text_content()
獲取屬性: .get_attribute()
# ul->li下
link = element.query_selector('h5 a').get_attribute('href')
wait_for_load_state
"commit ": 接收到網(wǎng)絡(luò)響應(yīng)且文檔開(kāi)始加載時(shí)(僅顯示了頁(yè)面默認(rèn)窗口視圖下的元素)
"domcontentloaded": 認(rèn)為在 DOMContentLoaded 事件完成時(shí)(顯示了完整頁(yè)面)
"load": 在 load 事件完成時(shí)操作完成(含了所有圖片資源)
"networkidle": 至少 500 毫秒內(nèi)沒(méi)有網(wǎng)絡(luò)連接時(shí)操作完成
頁(yè)面加載的整個(gè)狀態(tài)變化
Commit -> DOMContentLoaded -> load -> networkidle
監(jiān)聽(tīng) response 事件:page.on()
from playwright.sync_api import sync_playwright
def on_response(response):
if '/api/movie/' in response.url and response.status == 200:
print(response.json())
print(f'Statue {response.status}:{response.url}')
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
# Page 就是單獨(dú)的一個(gè)瀏覽器 tab 標(biāo)簽
page = browser.new_page()
page.on('response', on_response)
# page.on('response', lambda response: on_response(response, product_data, id))
page.goto('https://spa6.scrape.center/')
page.wait_for_load_state('networkidle')
browser.close()
# 監(jiān)聽(tīng)彈窗
with page.expect_popup() as popup:
page.evaluate('window.open()')
popup.value.goto('http://www.baidu.com')
# 監(jiān)聽(tīng)請(qǐng)求
with page.expect_request('**/*login*.png') as first:
page.goto('http://www.baidu.com')
print(first.value.url)
傳參監(jiān)聽(tīng)
page.on('response', lambda response: on_response(response, id))
for (url, id) in urls:
pass
滾動(dòng)
下拉滾動(dòng)條
page.evaluate("var q=document.documentElement.scrollTop=15000")
鼠標(biāo)滾動(dòng)
page.mouse.wheel(0,7000)
截圖
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=50)
page = browser.new_page()
page.goto("http://www.baidu.com")
page.screenshot(path="example.png")
browser.close()
獲取cookie
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
cookies = context.storage_state()
cookie = '; '.join([f'{key["name"]}={key["value"]}' for key in cookies['cookies']])
CSS,xpath選擇器
t偽類選擇器
has-text():檢測(cè)包含(返回找到的所有元素)
text():檢測(cè)等于(返回第一個(gè)找到的元素)
# 選擇文本是 Log in 的節(jié)點(diǎn),并點(diǎn)擊
page.click("text=Log in",timeout=5000)
page.click("text=你好,請(qǐng)登錄")
page.locator(':has-text("All products")').click()
page.locator("#nav-bar :text('Contact us')").click()
page.locator('[data-test=login-button]').click()
page.locator("[aria-label='Sign in']").click()
# 選擇 id 為 nav-bar 子孫節(jié)點(diǎn) class 屬性值為 contact-us-item,并點(diǎn)擊
page.click("#nav-bar .contact-us-item")
# 選擇文本中包含 Playwright 的 article 節(jié)點(diǎn)
page.click("article:has-text('Playwright')")
# 選擇 id 為 nav-bar 節(jié)點(diǎn)中文本值等于 Contact us 的節(jié)點(diǎn)
page.click("#nav-bar :text('Contact us')")
# 選擇 class 為 item-description 的節(jié)點(diǎn),且該節(jié)點(diǎn)還要包含 class 為 item-promo-banner 的子節(jié)點(diǎn)
page.click(".item-description:has(.item-promo-banner)")
# 擇的就是一個(gè) input 節(jié)點(diǎn),并且該 input 節(jié)點(diǎn)要位于文本值為 Username 的節(jié)點(diǎn)的右側(cè)
page.click("input:right-of(:text('Username'))")
# xpath
page.click("xpath=//button")
get_by_xxx定位器
●page.get_by_text(文本,**kwargs)按文本內(nèi)容定位。
●page.get_by_role(角色,**kwargs)按角色屬性
●page.get_by_label(文本,**kwargs)通過(guò)關(guān)聯(lián)標(biāo)簽的文本查找表單控件
● page.get_by_test_id(test_id)根據(jù)元素的屬性定位元素(可以配置其他屬性)
page.get_by_placeholder(文本,**kwargs)按占位符查找輸入
● 通過(guò)其文本替代來(lái)定位元素,通常是圖像。
●page.get_by_title(文本,**kwargs)按標(biāo)題定位元素。
page.get_by_label("Password").fill("secret-password")
page.get_by_role("option", name="全部企業(yè)").click()
page.get_by_role("button", name="Sign in").click()
# 關(guān)閉詳情彈窗
page.frame_locator("internal:attr=[title=\"詳情頁(yè)\"i]").locator(
"#enterprise-details-close").click()
# 文本內(nèi)容
page.get_by_text(str(select_text)).click()
# 正則匹配定位
page.get_by_role("tab", name=re.compile("風(fēng)險(xiǎn)信息", re.IGNORECASE)).click()
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-413332.html
循環(huán)遍歷ul: query_selector_all()
uls = page.query_selector_all('//*[@id="YZhV9-anchor"]//table[@class="ant-table-fixed"]/tbody/tr')
for ele_items in uls:
title = ele_items.query_selector('section > div._3KXtu._3jY37 > a').text_content()
同級(jí)第幾個(gè):.nth(2)
點(diǎn)擊最后一個(gè)按鈕
page.click("button >> nth=-1")
page.get_by_placeholder("請(qǐng)輸入手機(jī)號(hào)碼").nth(1).click()
文本輸入:.fill()
# 標(biāo)簽定位輸入
page.locator('text=First Name').fill('Peter')
page.get_by_placeholder("請(qǐng)輸入手機(jī)號(hào)碼").nth(1).fill('12345678901')
定位器過(guò)濾器:filter
page.locator("a").filter(has_text="密碼登錄").click()
刷新,前進(jìn),后退
page.reload(**kwargs) # 刷新
page.go_back(**kwargs) # 后退
page.go_forward(**kwargs) # 前進(jìn)
等待
# 等待直到title元素被加載完全
page.locator("title").wait_for()
# 會(huì)自動(dòng)等待按鈕加載好再執(zhí)行點(diǎn)擊
page.locator("button", has_text="sign up").click()
# Playwright 會(huì)等待 #search 元素出現(xiàn)在 DOM 中
page.fill('#search', 'query')
# Playwright 會(huì)等待元素停止動(dòng)畫并接受點(diǎn)擊
page.click('#search')
# 等待 #search 出現(xiàn)在 DOM 中
page.wait_for_selector('#search', state='attached')
# 等待 #promo 可見(jiàn), 例如具有 `visibility:visible`
page.wait_for_selector('#promo')
# 等待 #details 變得不可見(jiàn), 例如通過(guò) `display:none`.
page.wait_for_selector('#details', state='hidden')
# 等待 #promo 從 DOM 中移除
page.wait_for_selector('#promo', state='detached')
# 隨機(jī)等待
page.wait_for_timeout(random.uniform(2500, 4500))
點(diǎn)擊
- 左鍵點(diǎn)擊:page.click(“id=su”)
- 點(diǎn)擊元素左上角:page.click(‘id=su’, position={‘x’: 0, ‘y’: 0})
- Shift + click:page.click(“id=su”, modifiers=[‘Shift’])
- 強(qiáng)制點(diǎn)擊:page.click(“id=su”, force=True)
- 右鍵點(diǎn)擊:page.click(“id=su”, button=‘right’)
- 雙擊:page.dblclick(“id=su”)
- 懸停在元素上:page.hover(‘id=su’)
模擬鍵盤輸入
page.press("id=kw", 'Control+A'):Control+A
page.press('id=kw', 'Enter'):點(diǎn)擊回車
# 一個(gè)字符一個(gè)字符的輸入
page.type("id=kw", "playwright", delay=100): 每個(gè)字符延遲100ms輸入
參考:
https://huaweicloud.csdn.net/63802f5edacf622b8df864ec.html#devmenu22
https://blog.csdn.net/u010698107/article/details/121070336文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-413332.html
到了這里,關(guān)于Playwright 入門詳細(xì)教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!