(1) Selenium需要通過WebDriver操作瀏覽器;Playwright通過開發者工具與瀏覽器交互,安裝簡潔,不需要安裝各種Driver。
(2) Playwright幾乎支持所有語言,且不依賴於各種Driver,通過調用內置瀏覽器所以啓動速度更快。
(3) Selenium基於HTTP協議(單向通訊),Playwright基於Websocket(雙向通訊)可自動獲取瀏覽器實際情況。
(4) Playwright爲自動等待。
-
等待元素出現(定位元素時,自動等待30s,等待時間可以自定義,單位毫秒)
-
等待事件發生
1.2 已知侷限性
(1) Playwright不支持舊版Microsoft Edge或IE11。支持新的Microsoft Edge(在Chromium上);所以對瀏覽器版本有硬性要求的項目不適用。
(2) 需要SSL證書進行訪問的網站可能無法錄製,該過程需要單獨定位編寫。
(3) 移動端測試是通過桌面瀏覽器來模擬移動設備(相當於自帶模擬器),無法控制真機。
注意:python 版本需要在3.7 以上
1.pip install playwright 安裝playwright 依賴
2.python -m playwright install 安裝chromium,webkit,firefox 依賴
3.python -m playwright codegen 記錄瀏覽器行爲就是錄製
4.python3 -m playwright codegen --help 查看幫助
5.python -m playwright codegen --target python -o 'shortcut.py' -b chromium https://www.baidu.com
監聽百度行爲
6.也可以錄製視頻
from playwright import sync_playwright
with sync_playwright() as p:
for browser_type in [p.chromium, p.firefox, p.webkit]:
browser = browser_type.launch()
page = browser.newPage()
page.goto('http://baidu.com/')
page.screenshot(path=f'example-{browser_type.name}.png')
browser.close()
7.參數
-
-o, --output <file name>
:保存生成腳本 -
--target <language>
:生成的腳本語言,可以設置javascript, test, python, python-async和csharp,默認爲python。 -
-b, --browser <browserType>
:要使用的瀏覽器,可以選擇cr, chromium, ff, firefox, wk和webkit,默認chromium。 -
--channel <channel>
:chromium版本,比如chrome, chrome-beta, msedge-dev等, -
--color-scheme <scheme>
:模擬器的顏色主題,可選擇light 或者 dark樣式。 -
--device <deviceName>
:模擬的設備,比如iPhone 11。 -
--save-storage <filename>
:保存上下文狀態,用於保存cookies 和localStorage,可用它來實現重用。例如playwright codegen --save-storage=auth.json
-
--load-storage <filename>
:加載--save-storage
保存的數據,重用認證數據。 -
--proxy-server <proxy>
:指定代理服務器 -
--timezone <time zone>
: 指定時區 -
--geolocation <coordinates>
:指定地理位置座標 -
--lang <language>
:指定語言/地區,比如中國大陸:zh-CN -
--timeout <timeout>
:超時時間,定位毫秒,默認10000ms -
--user-agent <ua string>
:用戶代理 -
--viewport-size <size>
:瀏覽器窗口大小 -
-h, --help
:查看幫助信息
8.模擬手機器打開iphone12 pro
playwright codegen -o test_playwright.py --target python -b chromium --device="iPhone 12 Pro" https://www.baidu.com/
9.錄製命令
npx playwright codegen [options] [url]
10.同步demo
# -------
import time
from playwright.sync_api import sync_playwright
def testcase1():
print('testcase1 start')
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.baidu.com/")
print(page.title())
page.fill("input[name=\"wd\"]", "test")
page.click("text=百度一下")
page.click("#page >> text=2")
browser.close()
print('testcase1 done')
def testcase2():
print('testcase2 start')
with sync_playwright() as p:
browser2 = p.chromium.launch(headless=False)
page2 = browser2.new_page()
page2.goto("https://www.sogou.com/")
print(page2.title())
page2.fill("input[name=\"query\"]", "test")
page2.click("text=搜狗搜索")
page2.click("#sogou_page_2")
browser2.close()
print('testcase2 done')
start = time.time()
testcase1()
testcase2()
end = time.time()
print('Running time: %s Seconds'%(end-start))
11.異步demo
# -------
import asyncio
import time
from playwright.async_api import async_playwright
async def testcase1():
print('testcase1 start')
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto("https://www.baidu.com/")
print(await page.title())
await page.fill("input[name=\"wd\"]", "test")
await page.click("text=百度一下")
await page.click("#page >> text=2")
await browser.close()
print('testcase1 done')
async def testcase2():
print('testcase2 start')
async with async_playwright() as p:
browser2 = await p.chromium.launch(headless=False)
page2 = await browser2.new_page()
await page2.goto("https://www.sogou.com/")
print(await page2.title())
await page2.fill("input[name=\"query\"]", "test")
await page2.click("text=搜狗搜索")
await page2.click("#sogou_page_2")
await browser2.close()
print('testcase2 done')
async def main():
task1 = asyncio.create_task(testcase1())
task2 = asyncio.create_task(testcase2())
tasks = [task1,task2]
print('before await')
await asyncio.gather(*tasks)
start = time.time()
asyncio.run(main())
end = time.time()
print('Running time: %s Seconds'%(end-start))
12.異步執行效果是同步的一半,效率大大提高
13.啓動瀏覽器4種方式
chrome
browser = p.chromium.launch(channel="chrome", headless=False)
Microsoft Edge
browser = p.chromium.launch(channel="msedge", headless=False)
firefox
browser = p.firefox.launch(headless=False)
webkit
browser = p.webkit.launch(headless=False)
14.上下午切換
browser = p.chromium.launch(channel="chrome", headless=False)
15.browser是一個Chromium實例,創建實例其實是比較耗費資源的,Playwright支持在一個browser實例下創建多個瀏覽器上下文(BrowserContext),BrowserContext的創建速度很快,並且比創建browser實例消耗資源更少。對於多頁面場景可以使用創建瀏覽器上下文的方式。
import asyncio
from playwright.async_api import async_playwright
async def testcase1(): print('testcase1 start') async with async_playwright() as p: browser = await p.chromium.launch(headless=False) page = await browser.new_page() await page.goto("https://www.baidu.com/") print(await page.title()) await page.fill("input[name="wd"]", "test") await page.click("text=百度一下") await page.click("#page >> text=2")
context = await browser.new_context()
page2 = await context.new_page()
await page2.goto("https://www.sogou.com/")
print(await page2.title())
await page2.fill("input[name=\"query\"]", "test")
await page2.click("text=搜狗搜索")
await page2.click("#sogou_page_2")
print(await page.title())
print('testcase1 done')
asyncio.run(testcase1())
16.多頁面
async def testcase2(): print('testcase2 start') async with async_playwright() as p: browser = await p.chromium.launch(headless=False) context = await browser.new_context() page1 = await context.new_page() await page1.goto("https://www.sogou.com/") print(await page1.title()) await page1.fill("input[name="query"]", "test") await page1.click("text=搜狗搜索") await page1.click("#sogou_page_2")
page2 = await context.new_page()
await page2.goto("https://www.baidu.com/")
print(await page2.title())
print('testcase2 done')
17.斷言
assert page.title() == "百度一下,你就知道"
18.斷言匹配器
https://pyhamcrest.readthedocs.io/en/v2.0.2/tutorial/
pip install PyHamcrest
from hamcrest import * assert_that(page.title(), equal_to("百度一下,你就知道"))
(1)元素定位
-
選擇單個元素:querySelector(engine=body)
-
選擇多個元素:querySelectorAll(engine=body)
-
選擇單個元素,並且自動等待:waitForSelector(engine=body)
By的8種定位方式,實際爲4種
id、name、tag name、class name(java和pythona將該4種都歸爲CSS)
xpath、link text、partial link text、css selector
W3C標準規定的webDriver協議爲5種定位方式
CSS、Link text、Partial link text、Tag name、XPath
Playwright將選擇器彙總爲3種
CSS、XPATH(支持邏輯表達式和函數)、TEXT
(2)選擇器規則
-
CSS: ID選擇器、類選擇器、元素選擇器、屬性選擇器、通配選擇器、層次選擇器。
-
XPath: XML路徑語言,通過“路徑標識符”,導航XML文檔的,在類XML種(HTML)也可以使用。
-
Text: 結構化內容(html,xml,json)使用模糊匹配(忽略大小寫,忽略前後空格,搜索子字符串)及精確匹配、非結構化內容使用正則匹配。
(3)元素常用操作
-
下拉選擇框:selectOpion、value、labei、index
-
文件上傳:setInputFiles、單個文件、多個文件、拖放上傳
-
鼠標點擊:click、dbclick
-
鼠標拖動:down、up
-
鼠標移動:move
-
觸摸屏幕:tag
-
鍵盤按鍵:press
-
截屏、錄屏:screenshot、recordVideo
-