優點:
1、適用於多瀏覽器、多語言
2、可以使用基於css、xpath、text這些常用的元素定位方式進行錄制生成代碼,能大幅度的減少寫代碼的時間,同時代碼穩定性也可以保證
3、可以使用api方式操作瀏覽器內核,速度快,而且可以和瀏覽器雙向溝通,元素操作可以在元素ready的情況下進行,穩定性很好
4、支持UI和非UI方式運行,節省了debug、 run時間
5、與pytest測試框架集成
UI測試框架比較可參考:
蟲師的博文:https://www.cnblogs.com/fnng/p/14230840.html
或者https://www.testim.io/blog/puppeteer-selenium-playwright-cypress-how-to-choose/
重要的截圖看下:
安裝
1、安裝playwright庫(需要python3.7+)
pip install playwright
2、安裝瀏覽器驅動文件(自動安裝Chromium、Firefox、WebKit等瀏覽器的驅動文件)
python -m playwright install
錄制
錄制命令codegen
通過python -m playwright codegen --help 可查看所有用法
options含義:
-o:將錄制的腳本保存到一個文件的文件名稱
--target:指定生成的腳本語言,默認為python,目前支持python和JS
-b:指定瀏覽器驅動
例如:
使用谷歌瀏覽器打開百度搜索,腳本文件名稱為open_baidu.py,腳本語言為python
命令是:python -m playwright codegen --target python -o open_baidu.py -b chromium https://www.baidu.com
命令行輸入后會自動打開瀏覽器,然后在瀏覽器上的一舉一動都會被自動翻譯成代碼,結束后自動關閉瀏覽器,保存生成自動化腳本到py文件
執行命令后如下圖:
繼續操作,輸入關鍵字“三星堆”,點擊百度一下,再關閉瀏覽器,生成腳本如下:
源碼:
from playwright.sync_api import sync_playwright
def run(playwright):
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
# Open new page
page = context.new_page()
# Go to https://www.baidu.com/
page.goto("https://www.baidu.com/")
# Click input[name="wd"]
page.click("input[name=\"wd\"]")
# Fill input[name="wd"]
page.fill("input[name=\"wd\"]", "三星堆")
# Click text=百度一下
page.click("text=百度一下")
# assert page.url == "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E4%B8%89%E6%98%9F%E5%A0%86&fenlei=256&rsv_pq=f1b6d9eb0013cce4&rsv_t=7ce127Agtx9HVMNsGe8C3CFkBbc%2FkR2ZyMvDG%2B0UkRXKIQJ5bbY3zm6BO44&rqlang=cn&rsv_enter=1&rsv_dl=ib&rsv_sug3=11&rsv_sug1=2&rsv_sug7=100"
# Close page
page.close()
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
支持同步:
源碼1:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://www.baidu.com")
print(page.title())
page.screenshot(path=f'example.png')
browser.close()
源碼2(參考鏈接:http://www.51ste.com/share/det-5936-2.html):from time import sleep
from playwright.sync_api import sync_playwright
# 注意:默認是無頭模式
with sync_playwright() as p:
# 分別對應三個瀏覽器驅動
for browser_type in [p.chromium, p.firefox, p.webkit]:
# 指定為有頭模式,方便查看
browser = browser_type.launch(headless=False)
page = browser.new_page()
page.goto('http://baidu.com')
# 執行一次搜索操作
page.fill("input[name=\"wd\"]", "自動化測試實戰寶典")
with page.expect_navigation():
page.press("input[name=\"wd\"]", "Enter")
# 等待頁面加載完全
page.wait_for_selector("text=搜索工具")
# 截圖
page.screenshot(path=f'test-{browser_type.name}.png')
# 休眠3s
sleep(3)
# 關閉瀏覽器
browser.close()
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
for browser_type in [p.chromium, p.firefox, p.webkit]:
browser = await browser_type.launch()
page = await browser.new_page()
await page.goto('https://www.baidu.com/')
await page.screenshot(path=f'example-{browser_type.name}.png')
print(await page.title())
await browser.close()
#asyncio.run(main())
源碼2:
import asyncio
from playwright.async_api import async_playwright
from time import sleep
# 異步執行
async def main():
async with async_playwright() as p:
for browser_type in [p.chromium, p.firefox, p.webkit]:
# 指定為有頭模式,方便查看
browser = await browser_type.launch(headless=False)
page = await browser.new_page()
await page.goto('https://www.baidu.com')
# 執行一次搜索操作
await page.fill("input[name=\"wd\"]", "自動化測試實戰寶典")
await page.press("input[name=\"wd\"]", "Enter")
# 等待頁面加載完全
await page.wait_for_selector("text=搜索工具")
# 等待3秒
sleep(3)
# 截圖
await page.screenshot(path=f'test-{browser_type.name}.png')
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
同步和異步的注意包的引入,否則會報錯:Cannot find reference 'async_playwright' in '__init__.py'
支持移動端
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
iphone_11 = p.devices['iPhone 11 Pro']
browser = p.webkit.launch(headless=False)
context = browser.new_context(
**iphone_11,
locale='en-US',
geolocation={'longitude': 12.492507, 'latitude': 41.889938},
permissions=['geolocation']
)
page = context.new_page()
page.goto('https://maps.google.com')
page.click('text="Your location"')
page.screenshot(path='colosseum-iphone.png')
browser.close()
支持pytest測試框架
參考文章:
https://blog.csdn.net/tomoya_chen/article/details/115648583
https://github.com/microsoft/playwright-pytest
更多功能參考官方文檔:https://playwright.dev/python/docs/intro/
參考鏈接:
https://www.imooc.com/article/314264
http://quan.51testing.com/pcQuan/article/116997
http://www.51ste.com/share/det-5936-1.html
https://blog.csdn.net/tomoya_chen/article/details/115648583