Selenium入門
歡迎閱讀Selenium入門講義,本講義將會重點介紹Selenium的入門知識以及Selenium的前置知識。
自動化測試的基礎
在Selenium的課程以前,我們先回顧一下軟件測試的基本原理,為我們進一步完成Selenium自動化測試做好準備。
軟件測試的發展
- 傳統軟件測試
G.J.Myers在其經典的著作《軟件測試藝術》(The Art of Software Testing)一書中,給出了測試的定義:
“程序測試是為了發現錯誤而執行的過程?!?/p>
這個概念產生于30年前,對軟件測試的認識還非常有局限性,當然也是因為受瀑布開發模型的影響,認為軟件測試是編程之后的一個階段。只有等待代碼開發出來以后,通過執行程序,像用戶那樣操作軟件去發現問題。
- 敏捷軟件測試
當前,軟件測試貫穿到整個軟件開發生命周期的全過程中,不再停留在編程之后的某個階段,尤其是敏捷開發開始廣泛的應用于互聯網行業以后,敏捷測試就把軟件測試解釋為對軟件產品質量的持續評估
。在敏捷方法中,持續測試被提倡。當前的持續測試的實施,主要依托于持續集成。
持續集成和持續測試的產生和發展,對自動化測試產生了比較高的要求。此外隨著大數據和機器學習的發展,對自動化測試的需求越來越迫切。
簡單的描述一下持續集成
,Continuous Integration,簡稱CI。是一種軟件工程實踐:項目需要經常性的集成,進行代碼編譯,版本構建,自動化的部署以及部署后的自動化測試。也是云開發測試模式的一種。
持續集成構成了持續交付的基礎。
- 自動化測試
自動化測試:以人為驅動的測試行為轉化為機器執行的一種過程
- 主要自動化測試類型
- Web UI自動化測試
- Web API自動化測試
- App UI自動化測試
- ……
軟件測試的維度
- 從軟件測試的過程看:單元測試、集成測試、確認測試、系統測試、驗收測試
- 從軟件測試的方法看:白盒測試、黑盒測試、灰盒測試
- 從軟件測試的測試點看:功能測試、性能測試、兼容性測試、安全測試、探索性測試、配置測試
- 從軟件測試的技術程度看:手工測試、自動化測試、測試開發
自動化測試的場景
自動化測試應用的場景:
- 測試 UI 界面、測試接口調用
- 冒煙測試(預測試、確認測試)
- 回歸測試
- 驗收測試
什么樣的項目適合自動化測試
- 任務測試明確,不會頻繁變動
- 每日構建后的測試驗證
- 比較頻繁的回歸測試
- 軟件系統界面穩定,變動少
- 需要在多平臺上運行的相同測試案例、組合遍歷型的測試、大量的重復任務
- 軟件維護周期長
- 項目進度壓力不太大
- 被測軟件系統開發比較規范,能夠保證系統的可測試性
- 具備大量的自動化測試平臺
- 測試人員具備較強的編程能力
自動化測試工具介紹
- HP UFT (QTP)
- Selenium
- HP LoadRunner
- Robot Framework
- Watir (webapplication test in ruby)
- SoapUI
- Appium
Web測試技術
Selenium是一款出色的Web自動測試工具,那么在使用之前,Web測試的基本技術也是必須需要了解的。
相關測試技術
基礎技術 | 高階技術 |
---|---|
Python/Java語言 | Ajax |
Html和CSS | Html5+CSS3 |
JavaScript語言和框架(其中jQuery是基礎框架) | Bootstrap |
JSON和XML | AngularJS |
相關測試工具
工具 | 描述 | 參考 |
---|---|---|
Firebug(已停止) | FireFox火狐瀏覽器所自帶的一個前端插件 | 下載地址:http://getfirebug.com |
PyChram | JetBrains公司的Python開發工具 | 下載地址:https://www.jetbrains.com/pycharm/ |
IDEA | JetBrains公司的Java開發工具 | 下載地址:https://www.jetbrains.com/idea/ |
開發者工具 | Chrome瀏覽器的開發者工具 | 打開Chrome瀏覽器,按F12,打開開發者工具 |
SVN/Git | 源代碼管理工具 | 開源版的源代碼管理工具 |
什么是Selenium
Selenium
Selenium is a suite oftools to automate web browsers across many platforms.
- runs in many browsers and operatingsystems
- can be controlled by manyprogramming languages and testing frameworks.
硒,
/s?'lini?m/
Selenium是開源的自動化測試工具,它主要是用于Web 應用程序的自動化測試,不只局限于此,同時支持所有基于web 的管理任務自動化。
Selenium 是用于測試 Web 應用程序用戶界面 (UI) 的常用框架。它是一款用于運行端到端功能測試的超強工具。您可以使用多個編程語言編寫測試,并且 Selenium 能夠在一個或多個瀏覽器中執行這些測試。
Selenium經歷了兩個版本,Selenium1.0 和Selenium2.0,Selenium 也不是簡單一個工具,而是由幾個工具組成,每個工具都有其特點和應用場景。
Selenium是在2004年由一個叫Jason Huggins的聰明的年輕人開發的,當時身處ThoughtWorks的他,為了不想讓自己的時間浪費在無聊的重復性工作中,所以開發一個JS的類庫來驅動瀏覽器頁面的行為;這個js類庫就是selenium core,同時也是seleniumRC、Selenium IDE的核心組件。這就是Selenium1.0的產生史。
在2006年,在google的一位有膽識的年輕人Simon Stewart發起了一個叫WebDriver的項目;因為長期以來google一直是selenium的重度用戶,但卻總是被限制在有限的操控范圍內,所以Simon希望能通過瀏覽器、操作系統的底層方法等一些手段來直接操作瀏覽器;這樣就避免了在JavaScript的沙箱環境里存在的那些限制了,webdriver項目就此誕生!
在2008年,Selenium和webdriver結合了,從此永結良緣,福澤我們廣大的測試工作者。這期間誰追的誰都不重要了,重要的是他們合并的原因正如webdriver的作者所說:
部分原因是 selenium 補充了 webdriver 的不足
部分原因是 webdriver 補充了 selenium 的不足
部分原因是它們合體后能給用戶提供一個更好的自動化測試框架
所以管它呢,現在大家有一個比較好用的 selenium 就行了!
Selenium 1 和 WebDriver 合并成一款性能更佳的產品 Selenium 2(或 Selenium WebDriver),該款產品發行于 2011 年。Selenium 2 具有來自 WebDriver 的清晰面向對象 API,并能以最佳的方式與瀏覽器進行交互。Selenium 2 不使用 JavaScript 沙盒,它支持多種瀏覽器和多語言綁定。
介紹 Selenium
Selenium 是一組軟件工具集,每一個都有不同的方法來支持測試自動化。大多數使用 Selenium 的QA工程師只關注一兩個最能滿足他們的項目需求的工具上。然而,學習所有的工具你將有更多選擇來解決不同類型的測試自動化問題。這一整套工具具備豐富的測試功能,很好的契合了測試各種類型的網站應用的需要。這些操作非常靈活,有多種選擇來定位 UI 元素,同時將預期的測試結果和實際的行為進行比較。Selenium 一個最關鍵的特性是支持在多瀏覽器平臺上進行測試。
Selenium 項目簡史
Selenium 誕生于 2004 年,當在 ThoughtWorks 工作的 Jason Huggins 在測試一個內部應用時。作為一個聰明的家伙,他意識到相對于每次改動都需要手工進行測試,他的時間應該用得更有價值。他開發了一個可以驅動頁面進行交互的 Javascript 庫,能讓多瀏覽器自動返回測試結果。那個庫最終變成了 Selenium 的核心,它是 Selenium RC(遠程控制)和 Selenium IDE 所有功能的基礎。Selenium RC 是開拓性的,因為沒有其他產品能讓你使用自己喜歡的語言來控制瀏覽器。
Selenium 是一個龐大的工具,所以它也有自己的缺點。由于它使用了基于 Javascript 的自動化引擎,而瀏覽器對 Javascript 又有很多安全限制,有些事情就難以實現。更糟糕的是,網站應用正變得越來越強大,它們使用了新瀏覽器提供的各種特性,都使得這些限制讓人痛苦不堪。
在 2006 年,一名 Google 的工程師, Simon Stewart 開始基于這個項目進行開發,這個項目被命名為 WebDriver。此時,Google 早已是 Selenium 的重度用戶,但是測試工程師們不得不繞過它的限制進行工具。Simon 需要一款能通過瀏覽器和操作系統的本地方法直接和瀏覽器進行通話的測試工具,來解決Javascript 環境沙箱的問題。WebDriver 項目的目標就是要解決 Selenium 的痛點。
跳到 2008 年。北京奧運會的召開顯示了中國在全球的實力,大規模的次貸危機引發了“大蕭條”以來美國最大的經濟危機。但是當年最重要的故事是 Selenium 和WebDriver 的合并。Selenium 有著豐富的社區和商業支持,但 WebDriver 顯然代表著未來的趨勢。兩者的合并為所有用戶提供了一組通用功能,并且借鑒了一些測試自動化領域最閃光的思想?;蛟S,關于兩者合并的最好解釋,是由 WebDriver 的開發者,在 2009 年 8 月 6 日發出的一封給社區的聯合郵件中提到的:
為什么這兩個項目要合并?一部分是因為 WebDriver 彌補了 Selenium 的一些短處(例如提供了一組很棒的 API,繞開瀏覽器的限制),一部分是因為 Selenium 彌補了 WebDriver 的一些短處(例如對瀏覽器更廣泛的支持),還有一部分是因為 Selenium 的主要貢獻者和我都認為這樣能為用戶提供最優秀的框架。
Selenium 工具集
Selenium 由多個軟件工具組成,每個具備特定的功能。
Selenium 2 (又叫 Selenium Webdriver)
Selenium 2 代表了這個項目未來的方向,也是最新被添加到 Selenium 工具集中的。這個全新的自動化工具提供了很多了不起的特性,包括更內聚和面向對象的 API,并且解決了舊版本限制。
正如簡史中提到的,Selenium 和 WebDriver 的作者都贊同兩者各具優勢,而兩者的合并使得這個自動化工具更加強健。
Selenium 2.0正是于此的產品。它支持WebDriver API及其底層技術,同時也在WebDriver API底下通過Selenium 1技術為移植測試代碼提供極大的靈活性。此外,為了向后兼容,Selenium 2 仍然使用 Selenium 1 的 Selenium RC 接口。
Selenium 1 (又叫 Selenium RC 或 Remote Control)
正如你在簡史中讀到的,在很長一段時間內,Selenium RC 都是最主要的 Selenium 項目,直到 WebDriver 和 Selenium 合并而產生了最新且最強大的 Selenium 2.
Seleinum 1 仍然被活躍的支持著(更多是維護),并且提供一些 Selenium 2 短時間內可能不會支持的特性,包括對多種語言的支持(Java, Javascript, Ruby, PHP, Python, Perl and C#) 和對大多數瀏覽器的支持。
Selenium IDE
Selenium IDE (集成開發環境) 是一個創建測試腳本的原型工具。它是一個 Firefox 插件,提供創建自動化測試的建議接口。Selenium IDE 有一個記錄功能,能記錄用戶的操作,并且能選擇多種語言把它們導出到一個可重用的腳本中用于后續執行。
注意
雖然 Selenium IDE 有保存功能,能讓用戶以表格的形式保存測試,以供后續的導入和執行,但它不是用于執行你的測試是否通過,也不能創建所有你需要的自動化測試。需要注意的是,Selenium IDE 不能生成含有迭代和條件語句的測試腳本。在本文檔編寫時也沒有要實現該功能的計劃。這部分是因為技術原因,部分是因為 Selenium 的開發者所推薦的自動化測試的最佳實踐常常是需要編寫一些代碼的。Selenium IDE 只是被設計為一個快速的原型工具。Selenium 的開發者推薦選用支持的最好的語言來創建嚴謹、健壯的測試,不管是使用 Selenium 1 還是 Selenium 2.
Selenium-Grid
Selenium-Grid 使得 Selenium RC 解決方案能提升針對大型的測試套件或者哪些需要運行在多環境的測試套件的處理能力。Selenium Grid 能讓你并行的運行你的測試,也就是說,不同的測試可以同時跑在不同的遠程機器上。這樣做有兩個有事,首先,如果你有一個大型的測試套件,或者一個跑的很慢的測試套件,你可以使用 Selenium Grid 將你的測試套件劃分成幾份同時在幾個不同的機器上運行,這樣能顯著的提升它的性能。同時,如果你必須在多環境中運行你的測試套件,你可以獲得多個遠程機器的支持,它們將同時運行你的測試套件。在每種情況下,Selenium Grid 都能通過并行處理顯著地縮短你的測試套件的處理時間。
為什么選擇 Selenium
Selenium特點:
- 開源,免費
- 多瀏覽器支持:Firefox、Chrome、IE、Opera、Safari
- 多平臺支持:Linux 、windows、Mac
- 多語言支持:Java、Python、ruby、PHP、C#、JavaScript
- 對web 頁面有良好的支持
- 簡單(API 簡單)、靈活(用開發語言驅動)
- 支持分布式測試用例執行
Selenium的家譜
Selenium到目前為止已經經歷了兩個版本:Selenium 1.0
和Selenium2.0
.
Selenium官方網站:http://docs.seleniumhq.orgSelenium github:https://github.com/SeleniumHQ/selenium
Selenium1.0:包括 Selenium IDE,Selenium Grid和Selenium RC(Selenium Remote Control)
Selenium IDE 是嵌入到Firefox 瀏覽器中的一個插件,實現簡單的瀏覽器操作的錄制與回放功能。
那么什么情況下用到它呢?
快速的創建bug 重現腳本,在測試人員的測試過程中,發現了bug 之后可以通過IDE 將重現的步驟錄制下來,以幫助開發人員更容易的重現bug。
IDE 錄制的腳本可以可以轉換成多種語言,從而幫助我們快速的開發腳本。
Selenium IDE 下載地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/
Selenium Grid 是一種自動化的測試輔助工具,Grid 通過利用現有的計算機基礎設施,能加快WebApp的功能測試。利用Grid,可以很方便地同時在多臺機器上和異構環境中并行運行多個測試事例。其特點為:
并行執行
通過一個主機統一控制用例在不同環境、不同瀏覽器下運行。
靈活添加變動測試機
Selenium RC 是selenium 家族的核心工具,Selenium RC 支持多種不同的語言編寫自動化測試腳本,通過selenium RC 的服務器作為代理服務器去訪問應用從而達到測試的目的。
selenium RC 使用分Client Libraries 和Selenium Server。
Client Libraries 庫主要主要用于編寫測試腳本,用來控制selenium Server 的庫。
-
Selenium Server 負責控制瀏覽器行為,總的來說,Selenium Server 主要包括3 個部分:Launcher、Http Proxy、Core。
Selenium Core 是被Selenium Server 嵌入到瀏覽器頁面中的。Selenium Core就是一堆JavaScript函數的集合,就是通過這些JavaScript函數,我們才可以實現用程序對瀏覽器進行操作。
Launcher 用于啟動瀏覽器,把Selenium Core 加載到瀏覽器頁面當中,并把瀏覽器的代理設置為Selenium Server 的Http Proxy。
Selenium2.0:包括了WebDriver。其實在Selenium2.0中主推的就是WebDriver這個模塊。事實上WebDriver是Selenium RC的替代品,因為Selenium需要保留向下兼容性的原因,Selenium RC才沒有被徹底的拋棄,如果使用Selenium開發一個新的自動化測試項目,那么我們強烈推薦使用Selenium2.0的WebDriver進行編碼。
Selenium2.0 = Selenium1.0 + WebDriver
Selenium RC的實質是在瀏覽器中運行一個JavaScript應用程序,使用每個瀏覽器內置的JavaScript解釋器來解釋和執行Selenium的命令集合。
Selenium WebDriver與上述的Selenium RC是不同的。WebDriver針對不同的瀏覽器進行開發,取代了RC那樣嵌入到被測試的WebApp程序中的JavaScript,使用了與瀏覽器更加集成的方式進行測試,避免了RC使用JavaScript而可能遇到的安全模型限制導致的問題等。
在此我們也更加推薦讀者使用Selenium2.0的WebDriver開始學習。
編程語言的選擇
Selenium1.0代表的是經典,Selenium2.0代表的是未來。
我們在此重點關注Selenium2.0的WebDriver。而WebDriver面臨的第一個選擇就是編程語言。WebDriver支持眾多的編程語言,例如,C#、Ruby、Python、 Java、Javacript、Objective-C、PHP。我們在使用之前必須要確定一種。
編程語言的選擇,我們選了Java 和Python。主要出于以下幾個原因。
Python 語言特性:便捷
- 測試人員的編程能力普遍不是很強,而Python作為一種腳本語言,不僅功能強大,而且語法優美,支持多種自動化測試工具,而且學習上手比較容易。
- Python的社區發展比較好,有著非常多的文檔和支持庫,另外Python也可以在Web開發、數據處理、科學計算等縱多領域有著非常好的應用前景。
- 對于有一定編程基礎的人員,使用Python作為自動化測試的語言可以非常順暢的轉換,幾乎沒有學習成本。同時Python是標準的面向對象的編程語言,對于C#、Java等面向對象的語言有著非常好的示例作用,通過Python的示例可以非常輕松的觸類旁通,使用其他語言進行Selenium2.0的WebDriver的使用。
Python
/'pa?θ?n/
Python的創始人為Guido Van Rossum。1989年圣誕節期間,在阿姆斯特丹,Guido為了打發圣誕節的無趣,決心開發一個新的腳本解釋程序,做為ABC 語言的一種繼承。之所以選中Python(大蟒蛇的意思)作為程序的名字,是因為他是一個叫Monty Python的喜劇團體的愛好者。
Python 語言除了在自動化測試領域有出色的表現外,在系統編程,網絡編程,web 開發,GUI開發,科學計算,游戲開發等多個領域應用非常廣泛,而且具有非常良好的社區支持。也就是說學習和掌握python 編程,其實是為你打開了一道更廣闊的大門。
Java 語言特性:健壯
- 面向對象
- Java語言提供類、接口和繼承等原語,為了簡單起見,只支持類之間的單繼承,但支持接口之間的多繼承,并支持類與接口之間的實現機制(關鍵字為implements)。Java語言全面支持動態綁定,而C++語言只對虛函數使用動態綁定。總之,Java語言是一個純的面向對象程序設計語言。
- 平臺無關
- Java程序(后綴為java的文件)在Java平臺上被編譯為體系結構中立的字節碼格式(后綴為class的文件),然后可以在實現這個Java平臺的任何系統中運行。這種途徑適合于異構的網絡環境和軟件的分發。
- 支持Mac,Windows,Linux,UNIX
- 多線程
- 在Java語言中,線程是一種特殊的對象,它必須由Thread類或其子(孫)類來創建。通常有兩種方法來創建線程:其一,使用型構為Thread(Runnable)的構造子將一個實現了Runnable接口的對象包裝成一個線程,其二,從Thread類派生出子類并重寫run方法,使用該子類創建的對象即為線程。值得注意的是Thread類已經實現了Runnable接口,因此,任何一個線程均有它的run方法,而run方法中包含了線程所要運行的代碼。線程的活動由一組方法來控制。Java語言支持多個線程的同時執行,并提供多線程之間的同步機制(關鍵字為synchronized)。
- 安全性
- Java通常被用在網絡環境中,為此,Java提供了一個安全機制以防惡意代碼的攻擊。除了Java語言具有的許多安全特性以外,Java對通過網絡下載的類具有一個安全防范機制(類ClassLoader),如分配不同的名字空間以防替代本地的同名類、字節代碼檢查,并提供安全管理機制(類SecurityManager)讓Java應用設置安全哨兵。
接下來的示例我們將全部使用Java + Python進行講解。同時也建議在學習的過程中對于Python的相關語法進一步的學習。