第1章 Selenium自動化測試框架入門
1.1 Selenium自動化測試框架概述
說到目前流行的自動化測試工具,相信只要做過軟件測試相關工作,就一定聽說過Selenium。
圖1-1是某企業招聘自動化測試工程師的信息,大家可以看到在崗位任職條件方面明確指出要求應聘者具有Selenium等主流自動化測試工具的使用經驗。
圖1-1 某企業自動化測試工程師招聘信息
那么Selenium是誰開發的?它是用來解決什么問題的?它為什么會被自動化測試人員廣泛使用呢?
在日常的軟件測試工作中,功能測試是軟件測試的重要環節,而手動的功能測試有許多缺點,其中主要的缺點是測試過程單調且重復,這種長時間的重復操作容易使人厭倦、出錯。2004年,Thoughtworks的工程師Jason Huggins決定使用自動化測試工具來改變這種狀況。他開發了一款名為JavaScriptTestRunner的JavaScript程序,這款JavaScript程序可以自動進行Web應用程序的功能測試。同年,JavaScriptTestRunner更名為Selenium。
Selenium是開源的,可以在GitHub上找到,如圖1-2所示。Selenium是大型項目,包含用於支持Web瀏覽器自動化的一系列工具和庫。
圖1-2 GitHub上的Selenium項目信息
從圖1-2可以看出,在Selenium項目的倉庫中共有19個子項目,這也驗證了Selenium確實是大型項目。這里我們只關注Selenium的核心內容,而不去關注其他輔助性的子項目。
1.2 Selenium的歷史版本及核心組件
在寫作本書時,Selenium的最新可獲取版本是Selenium 4.0 alpha版本,而穩定版本是Selenium 3.0,對應的可下載版本是Selenium 3.141.0。為了使讀者能夠系統地掌握Selenium,我認為非常有必要了解Selenium的歷史版本及核心組件,Selenium的核心組件如圖1-3所示。
圖1-3 Selenium的核心組件
1.2.1 Selenium 1.0
1.Selenium IDE
2006年,Shinya Kasatani 開發了Selenium IDE的第一個版本,當時它是Firefox瀏覽器的一個插件。通過該插件,在Firefox瀏覽器中實現業務功能時,能夠自動錄制業務功能腳本,如圖1-4所示。你還可以根據需要將產生的腳本轉換為Python、Java、Ruby、C#等腳本信息,如圖1-5所示。錄制的腳本或者由腳本產生的腳本信息可以回放,從而驗證功能的正確性、可用性等。
圖1-4 通過Selenium IDE錄制腳本
圖1-5 由Selenium IDE轉換后的Python腳本信息
Selenium IDE具有以下特點。
- 操作簡單,不要求操作人員具有編碼能力。
- 測試腳本可復用,從而減輕測試人員的重復性操作壓力。
- 可以單個或批量運行測試腳本。
- 腳本支持命令行調用可用於持續集成。
- 可以控制腳本的執行速度。
- 一定程度上支持腳本調試功能,如斷點、單步運行等。
- 可以將腳本導出為使用多種不同語言。
這里只是對Selenium IDE做了簡單介紹,后續我們將進行更加詳細的介紹。
2.Selenium Remote Control(RC)
Paul Hammant開發了Selenium Remote Control,這里我們將Selenium Remote Control簡寫成Selenium RC。前面已經介紹過Selenium的核心是JavaScriptTestRunner。JavaScriptTestRunner是一組JavaScript函數,可首先通過使用瀏覽器內置的JavaScript解釋器進行解釋和執行Selenese命令,然后再將Selenium Core注入瀏覽器。但是,這里存在同源策略問題,也就是說,假設有一個JavaScript測試腳本,該腳本要訪問baidu.com域,從而訪問baidu.com/news、baidu.com/map之類的頁面元素,這沒有問題,但無法訪問epubit.com或bing.com等其他域的元素。因為baidu.com/news和baidu.com/map同源,它們有相同的域,都是baidu.com。那么怎么才能夠跨域訪問呢?Selenium RC就是用來解決這一問題的,它分為Client Library和Selenium Server兩部分。Client Library部分提供了豐富的接口,主要用於編寫自動化測試腳本來連接、控制Selenium Server。Selenium Server負責充當客戶端配置的HTTP代理,並“欺騙”瀏覽器以使Selenium Core和被測試的Web應用程序共享相同的來源,接收來自客戶端程序的命令,並將它們傳給瀏覽器。
3.Selenium Grid
Patrick Lightbody開發了Selenium Grid。Selenium Grid可以實現在不同的瀏覽器和操作系統中並行地執行測試腳本,從而最大限度地縮短測試時間,提升工作效率。具體的工作模式如下。
由一個Hub節點控制若干Node,Hub節點負責管理和收集Node的注冊和工作狀態等信息,接收遠程調用並將相關請求分發給各Node來執行。
1.2.2 Selenium 2.0
Selenium 2.0在Selenium 1.0的基礎上添加了對Selenium WebDriver的支持。
1.Selenium WebDriver
Selenium WebDriver由Simon Stewart在2006年開發,是一個可以在操作系統級別配置和控制瀏覽器的跨平台測試框架。Selenium WebDriver可直接與瀏覽器應用程序進行本地交互。Selenium WebDriver支持各種編程語言,如Python、Ruby、PHP和Perl等,還可以與JUnit和Unittest之類的單元測試框架集成以進行測試管理。
Selenium WebDriver架構主要包括4部分—— Selenium Client Library、JSON Wire Protocal Over HTTP Client、Browser Drivers和Browsers,如圖1-6所示。
圖1-6 Selenium WebDriver架構
- Selenium Client Library:Selenium自動化測試人員可以使用Java、Ruby、Python、C#等語言,利用它們提供的庫來編寫腳本。
- JSON Wire Protocol Over HTTP Client:JSON Wire Protocol是在HTTP服務器之間傳輸信息的REST風格的API。每個瀏覽器驅動程序(如FirefoxDriver、ChromeDriver等)都有它們各自的HTTP服務器。
- Browser Drivers:不同的瀏覽器都包含一個單獨的瀏覽器驅動程序。瀏覽器驅動程序與相應的瀏覽器通信。當瀏覽器驅動程序接收到任何指令時,將在相應的瀏覽器中執行,響應信息將以HTTP的形式返回。
- Browsers:Selenium支持多種瀏覽器,如Firefox、Chrome、IE、Safari等。
Selenium和WebDriver原本屬於兩個不同的項目。為了彌補Selenium和WebDriver各自的不足,形成更加完善的Selenium測試框架,才對這兩個項目進行了合並。
2.Selenium 3.0
目前發布的穩定版本是Selenium 3.0,Selenium 3.0版本做了以下更新。
- 去除了Selenium RC組件。
- Selenium 3.0只支持Java 8及以上版本。
- 在IE支持方面,只支持IE 9.0以上版本。
- Selenium 3.0中的Firefox需要使用獨立的瀏覽器驅動。
3.Selenium 4.0
自從2019年4月發布Selenium 4.0的第一個alpha版本以來,截至目前Selenium 4.0已有4個alpha版本,如圖1-7所示。Selenium 給自動化測試從業者帶來了更多的期待,那么Selenium 4.0又有什么新特性呢?
圖1-7 Selenium 4.0 alpha版本的獲取方式(針對Java語言)
單擊4.0.0-alpha-4鏈接,可以查看對應的Maven依賴信息,如圖1-8所示。
Selenium 4.0主要包括以下新特性。
- Selenium IDE功能改版:用過Selenium IDE的讀者都清楚,之前Selenium IDE以插件的形式運行在Firefox和Chrome瀏覽器中,改版后將能夠用於更多瀏覽器,同時還提供了全新的基於Node.js的CLI(命令行)運行程序,能夠並行執行測試用例,並提供通過和失敗的測試用例、執行耗時等相關信息。新的Selenium IDE運行程序完全基於Selenium WebDriver。
圖1-8 Selenium 4.0.0-alpha-4的Maven依賴信息
- WebDriver API成為W3C標准:WebDriver API不僅用於Selenium,還用在很多其他的自動化測試工具(如Appium)中。Selenium新版本最突出的變化是WebDriver API完全遵循W3C標准,這意味着WebDriver API現在可以跨不同的軟件實現,而不會出現任何兼容性問題。
- Selenium Grid改良:如果你以前用過Selenium Grid,一定會遇到一些節點配置方面的問題並記憶深刻。Selenium Grid有兩個基礎組件—— Node和Hub。Node用於執行測試用例,而Hub用於控制所有執行用例的Node。我們在連接Hub和Node時,經常會出現很多問題。但在Selenium 4.0中,當啟動Selenium Grid時,Selenium Grid將同時充當Hub和Node的角色,使得連接過程變得非常容易,從而很好地支持了Docker部署,並且不存在線程問題。Selenium Grid 服務器還可以輸出JSON格式的日志文件。在用戶界面上,Selenium 4.0也有了很多改良,可以直觀地看到執行測試用例的相關信息等。
- 更直觀方便的調試信息:鈎子(hook)和請求(request)跟蹤的日志記錄也得到了改進,因為可調試或可觀察性不再僅適用於DevOps。自動化測試人員現在可以更好地使用改進的用戶界面來進行調試。
- 更完善的文檔:文檔對於任何項目的成功都非常重要。自從Selenium 2.0發布以來,這些文件已經很多年沒有更新了。也就是說,任何想學習Selenium的人都必須依賴舊的教程,但許多特性在Selenium 3.0中已經發生了變化。SeleniumHQ承諾將提供一份新的文檔,這也許是自動化測試工程師最期待的更新。
答疑解惑群:50788246