新一代自動化測試神器Playwright

2023-04-15 15:01:17

轉載請註明出處❤️

作者:測試蔡坨坨

原文連結:caituotuo.top/4bedb73c.html


你好,我是測試蔡坨坨。

說到WebUI自動化測試,首當其衝的當屬Selenium,在很長的一段時間內,Selenium統治著Web自動化,Selenium其實經歷了四個階段,從2006年釋出的Selenium 1.0到最新的Selenium 4.8.3。

  • 2006年,Selenium 1.0釋出

    Selenium 1.0包含Selenium IDE(瀏覽器外掛,可以幫助我們錄製並生成指令碼,對於不會程式碼的同學來說,它是一個非常好的開始,但現在基本被淘汰了)、Selenium Grid(分散式,將一套指令碼分發到不同的機器上執行,功能非常強大,現在還在使用)、Selenium RC(指令碼控制瀏覽器實現自動化的原理,但是它的實現並不完善,到Selenium 2.0時代被WebDriver替代)。

    同年,Google工程師Simon Stewart發起了一個名為WebDriver的專案,它也是一個自動化測試工具,彼時剛剛起步,後來它也成為Selenium的競品之一。

  • 2009年,Selenium 2.0釋出

    2009年,在Google測試自動化會議上,Selenium和WebDriver兩個團隊的開發人員在溝通後決定合併這兩個專案,新專案被命名為Selenium Web Driver,也就是Selenium 2.0。很多人接觸Selenium,也是從Selenium 2.0開始的。WebDriver的實現原理其實就是在Web瀏覽器我們的指令碼之間有一個WebDriver,通過WebDriver協定去驅動並操作瀏覽器(具體實現+原始碼解析可參考往期文章「Selenium底層邏輯原始碼解析」)。

    WebDriver的作者是這樣解釋二者合併的原因:「一方面WebDriver解決了Selenium存在的缺點(例如:可以繞過JavaScript沙箱,WebDriver有出色的API),另一方面Selenium解決了WebDriver存在的問題,還有就是Selenium主要貢獻者和WebDriver的作者都認為合併專案是為使用者提供最優秀框架的最佳途徑。」

    Selenium 2.x(WebDriver)真正興起是在2014年開始,到2016年左右成為Web自動化最熱門的框架。幾乎談及Web自動化,那就是Selenium。它不僅在Web自動化測試領域很火,在爬蟲領域也是非常熱門。

  • 2016年,Selenium 3.0釋出

    這個版本並沒有引入新的工具,主要是加強了對瀏覽器的支援。

    完全移除了Selenium RC;WebDriver暴露一個供瀏覽器接入的API,通過各瀏覽器廠商提供的Driver來接入;將內建的Firefox Driver剔除;支援Firefox通過GRCKO Driver來接入Selenium;通過Apple提供的Safari Driver來接入Safari;通過Edge Driver支援IE接入。

    所以,3.x和2.x其實沒有太大的區別。

  • 2021年,Selenium 4.0釋出

    在Selenium 3.x中,與瀏覽器的通訊基於JSON-wire協定,因此Selenium需要對API進行編解碼。而Selenium 4遵循W3C標準協定,Driver與瀏覽器之間通訊的標準化使得它們可以直接通訊。

    除此之外,Selenium 4還做了一些其他的改動,可參考往期文章「Selenium 4 有哪些不一樣?」。

由於Selenium在3.x和4.x兩個版本的迭代中並沒有發生多大的變化,因此Selenium一統天下的地位也由於新框架的出現變得不那麼穩固。

2020年左右出現的Cypress、TestCafe、Puppeteer,在技術雷達中被譽為後Selenium時代Web UI自動化的三駕馬車。但是由於這三個框架都是基於JavaScript開發的,所以就需要測試人員熟悉JavaScript,並且都不支援Python,所以使用率並沒有很高。

Playwright簡介

2020年,微軟(Microsoft)開源了一個名為Playwright的工具,與Selenium一樣入門簡單,支援多語言(Python、Java、Node.js、.NET),大廠出品,必屬精品。它剛出現的時候,並沒有多火,隨著時間的推移,到2022年左右,Playwright已經被更多的人注意到並接受它,甚至比Selenium更好更強大。

Playwright是一款定位於端到端(End-to-End,端到端就是用於測試整個應用程式的流程是否符合預期的測試技術,模擬使用者真實使用場景,為實現這一目標,該系統通常被視為黑盒子,也就是所謂的黑箱測試,主要通過GUI和API等公共介面對其進行操作)的測試工具。

雖然目前在國內Web自動化測試的扛把子還是Selenium,但是國外已經有很多企業都在使用Playwright,比如:Adobe、微軟自帶的某些專案(Visual Studio Code、Bing)、Disney Hostar等。

既然在市面上已經有非常成熟好用的Selenium框架,並且在持續的更新,社群也十分活躍,微軟為什麼還要整一個額外的自動化測試工具出來呢?

兩個工具的定位不同,由於Playwright是後出來的工具,所以在一些細節方面會處理得更好。

  • 跨瀏覽器

    雖然Selenium提供了幾乎所有瀏覽器的相容和支援,但是還需要額外下載對應的瀏覽器版本的驅動,否則Selenium WebDriver可能就無法啟動。而Playwright內建了各種瀏覽器以及瀏覽器驅動(支援所有現代渲染引擎,包括Chromium、Firefox和WebKit),並且不需要額外的升級和管理,這樣一來整個自動化測試專案將會更加穩定。

  • 自動等待

    在使用Selenium的時候,我們通常會根據測試需求,在程式碼中加入各種等待,而在Playwright中沒有所謂的隱式等待,而顯示等待也已經封裝好了,直接呼叫即可。

  • Web優先斷言

    Playwright會根據網路環境進行自動斷言,直到滿足某種條件為止。

  • 追蹤

    Playwright可以很方便地設定重試策略,並進行自動的追蹤結果,以截圖和錄屏的方式進行記錄。

  • 並行執行

    在Selenium中,執行測試用例是單執行緒的,但是在Playwright中,由於執行機制不一樣(Selenium的指令傳送是通過http協定,而Playwright則是使用socket協定;Playwright是通過上下文管理瀏覽器,相當於每一個測試用例都會建立一個獨立的上下文,瀏覽器的上下文其實就是一個全新的瀏覽器,這種方式的好處就是在提速的同時又實現測試與測試之間的隔離,使得測試結果更加準確),所以可以實現並行執行。

  • 強大的工具集

    Playwright給我們提供了強大的工具集,例如:指令碼錄製工具codegen、指令碼編寫以及偵錯工具playwright等。

Playwright初體驗

以Python語言為例,編寫第一個Playwright指令碼。

PS:Playwright 需要 Python >=3.7 版本

安裝playwright

pip install playwright

安裝內建瀏覽器

使用以下命令安裝Playwright自帶的各種瀏覽器:

playwright install

由於安裝的內容比較多,所以這一步需要花費一點時間。

第一個Playwright指令碼

1. 使用with方式啟動
# author: 測試蔡坨坨
# datetime: 2023/4/8 2:18
# function: 第一個playwright指令碼,使用with寫法

from playwright.sync_api import sync_playwright, expect


def run(playwright):
    chromium = playwright.chromium  # or "firefox" or "webkit".
    browser = chromium.launch(headless=False)  # headless表示是否使用無頭瀏覽器(也就是無GUI模式)
    page = browser.new_page()
    page.goto("https://caituotuo.top")
    # other actions...
    print(page.title())
    browser.close()


with sync_playwright() as playwright:
    run(playwright)

# 這裡使用的是with方法,Python中的with方法可以很方便處理一些需要提前設定,事後需要清理的工作
# playwright正好有上下文處理,所以使用with寫法會使程式碼更加簡潔
# 比如:
# with open("/caituotuo.txt") as f:
#     f.read()
#
# 非with方式可能存在問題:1.可能忘記關閉檔案控制程式碼 2.檔案讀取資料時發生異常,但是沒有進行任何處理
# f = open("/caituotuo.txt")
# data = f.read()
# f.close()
2. 使用start()方式啟動
# author: 測試蔡坨坨
# datetime: 2023/4/8 2:20
# function: 使用start()寫法,直接範例化playwright同步方法

from playwright.sync_api import sync_playwright

playwright = sync_playwright().start()
chromium = playwright.chromium  # or "firefox" or "webkit".
browser = chromium.launch(headless=False)  # headless表示是否使用無頭瀏覽器(也就是無GUI模式)
page = browser.new_page()
page.goto("https://caituotuo.top")
# other actions...
print(page.title())
browser.close()

總結

Selenium和Playwright都是流行的自動化測試工具,都擁有豐富的功能和API,都可以用於Web應用程式的自動化測試。選擇一個測試框架,必須考慮日常工作中的場景以及當前的團隊,進而選擇合適的自動化測試工具來進行測試。而不是使用一個新的花裡胡哨的框架,然後一段時間後因為它沒有滿足我們的需求而拋棄它。

當然,同時掌握多種技術棧再好不過了,正所謂「兵來將擋,水來土掩」,無論企業中選擇哪種工具,都可以快速上手,也是自身能力的體現。

最重要的是要行動起來,多寫多練,日積月累,自然會如魚得水,真正把自動化測試在企業中落地,帶來對應的效率和質量保障方面的提升。