說到目前流行的自動化測試工具,相信只要作過軟件測試相關工做,就必定據說過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的核心內容,而不去關注其餘輔助性的子項目。ide
在寫做本書時,Selenium的最新可獲取版本是Selenium 4.0 alpha版本,而穩定版本是Selenium 3.0,對應的可下載版本是Selenium 3.141.0。爲了使讀者可以系統地掌握Selenium,我認爲很是有必要了解Selenium的歷史版本及核心組件,Selenium的核心組件如圖1-3所示。函數
圖1-3 Selenium的核心組件工具
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具備如下特色。
q 操做簡單,不要求操做人員具備編碼能力。
q 測試腳本可複用,從而減輕測試人員的重複性操做壓力。
q 能夠單個或批量運行測試腳本。
q 腳本支持命令行調用可用於持續集成。
q 能夠控制腳本的執行速度。
q 必定程度上支持腳本調試功能,如斷點、單步運行等。
q 能夠將腳本導出爲使用多種不一樣語言。
這裏只是對Selenium IDE作了簡單介紹,後續咱們將進行更加詳細的介紹。
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應用程序共享相同的來源,接收來自客戶端程序的命令,並將它們傳給瀏覽器。
Patrick Lightbody開發了Selenium Grid。Selenium Grid能夠實如今不一樣的瀏覽器和操做系統中並行地執行測試腳本,從而最大限度地縮短測試時間,提高工做效率。具體的工做模式以下。
由一個Hub節點控制若干Node,Hub節點負責管理和收集Node的註冊和工做狀態等信息,接收遠程調用並將相關請求分發給各Node來執行。
Selenium 2.0在Selenium 1.0的基礎上添加了對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架構
q Selenium Client Library:Selenium自動化測試人員可使用Java、Ruby、Python、C#等語言,利用它們提供的庫來編寫腳本。
q JSON Wire Protocol Over HTTP Client:JSON Wire Protocol是在HTTP服務器之間傳輸信息的REST風格的API。每一個瀏覽器驅動程序(如FirefoxDriver、ChromeDriver等)都有它們各自的HTTP服務器。
q Browser Drivers:不一樣的瀏覽器都包含一個單獨的瀏覽器驅動程序。瀏覽器驅動程序與相應的瀏覽器通訊。當瀏覽器驅動程序接收到任何指令時,將在相應的瀏覽器中執行,響應信息將以HTTP的形式返回。
q Browsers:Selenium支持多種瀏覽器,如Firefox、Chrome、IE、Safari等。
Selenium和WebDriver本來屬於兩個不一樣的項目。爲了彌補Selenium和WebDriver各自的不足,造成更加完善的Selenium測試框架,纔對這兩個項目進行了合併。
目前發佈的穩定版本是Selenium 3.0,Selenium 3.0版本作了如下更新。
q 去除了Selenium RC組件。
q Selenium 3.0只支持Java 8及以上版本。
q 在IE支持方面,只支持IE 9.0以上版本。
q Selenium 3.0中的Firefox須要使用獨立的瀏覽器驅動。
自從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主要包括如下新特性。
q Selenium IDE功能改版:用過Selenium IDE的讀者都清楚,以前Selenium IDE以插件的形式運行在Firefox和Chrome瀏覽器中,改版後將可以用於更多瀏覽器,同時還提供了全新的基於Node.js的CLI(命令行)運行程序,可以並行執行測試用例,並提供經過和失敗的測試用例、執行耗時等相關信息。新的Selenium IDE運行程序徹底基於Selenium WebDriver。
圖1-8 Selenium 4.0.0-alpha-4的Maven依賴信息
q WebDriver API成爲W3C標準:WebDriver API不只用於Selenium,還用在不少其餘的自動化測試工具(如Appium)中。Selenium新版本最突出的變化是WebDriver API徹底遵循W3C標準,這意味着WebDriver API如今能夠跨不一樣的軟件實現,而不會出現任何兼容性問題。
q 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也有了不少改良,能夠直觀地看到執行測試用例的相關信息等。
q 更直觀方便的調試信息:鉤子(hook)和請求(request)跟蹤的日誌記錄也獲得了改進,由於可調試或可觀察性再也不僅適用於DevOps。自動化測試人員如今能夠更好地使用改進的用戶界面來進行調試。
q 更完善的文檔:文檔對於任何項目的成功都很是重要。自從Selenium 2.0發佈以來,這些文件已經不少年沒有更新了。也就是說,任何想學習Selenium的人都必須依賴舊的教程,但許多特性在Selenium 3.0中已經發生了變化。SeleniumHQ承諾將提供一份新的文檔,這也許是自動化測試工程師最期待的更新。