潛水-pw

1. 爲什麼選擇Playwright

1.1 Playwright的優勢

(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

  •  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章