干貨||洞見Selenium 自動化測試
第一部分:使用測試工具從自動化測試的定義開始,主要討論自動化測試如何開展的話題。
第二部分:構(gòu)建測試方案在熟悉自動化測試的基礎(chǔ)上,主要討論如何構(gòu)建優(yōu)秀的自動化測試。
寫在最前面:目前自動化測試并不屬于新鮮的事物,或者說自動化測試的各種方法論已經(jīng)層出不窮,但是,能夠在項目中持之以恒的實踐自動化測試的團隊,卻依舊不是非常多。有的團隊知道怎么做,做的還不夠好;有的團隊還正在探索和摸索怎么做,甚至還有一些多方面的技術(shù)上和非技術(shù)上的舊系統(tǒng)需要重構(gòu)……
本文將會從使用和實踐兩個視角,嘗試對基于Web UI自動化測試做細致的分析和解讀,給各位去思考和實踐做一點引路,以便各團隊能找到更好的方式。
1. 使用測試工具
《論語》有云:工欲善其事,必先利其器。在開始具體的自動化測試之前,我們需要做好更多的準備,包括以下幾個方面:
- 認識自動化測試
- 準備自動化測試工具
- 使用有效的方式
- 針對具體的測試對象
接下來的第一部分內(nèi)容,我們將會從上述的幾個方面進行探討。
1.1 自動化測試理論介紹
- 自動化測試的5W
正如開篇所提到的,自動化測試不再是一個陌生的話題,而是一個具體的存在。作為測試實踐活動的一部分,我們首先分析一下自動化測試的方方面面。
- WHAT, 什么是自動化測試
G.J.Myers在其經(jīng)典的著作《軟件測試藝術(shù)》(The Art of Software Testing)一書中,給出了測試的定義:
“程序測試是為了發(fā)現(xiàn)錯誤而執(zhí)行的過程。”
這個概念產(chǎn)生于30年前,對軟件測試的認識還非常有局限性,當(dāng)然也是因為受瀑布開發(fā)模型的影響,認為軟件測試是編程之后的一個階段。只有等待代碼開發(fā)出來以后,通過執(zhí)行程序,像用戶那樣操作軟件去發(fā)現(xiàn)問題。
自動化測試:以人為驅(qū)動的測試行為轉(zhuǎn)化為機器執(zhí)行的一種過程
自動化測試,就是把手工進行的測試過程,轉(zhuǎn)變成機器自動執(zhí)行的測試過程。該過程,依舊是為了發(fā)現(xiàn)錯誤而執(zhí)行。因此自動化測試的關(guān)鍵在于“自動化”三個字。自動化測試的內(nèi)容,也就相應(yīng)的轉(zhuǎn)變成如何“自動化”去實現(xiàn)原本手工進行的測試的過程。
所有的“自動化”,依靠的無疑都是程序。
通過程序,可以把手工測試,轉(zhuǎn)變成自動化測試。
- WHEN, 在什么時候開展自動化測試
自動化測試的開展,依賴于“程序”。那么程序,其實就是由“源代碼”構(gòu)建而來的。那么原則上,只要能做出自動化測試所需要的“程序”的時候,變可以進行自動化測試。但往往,并不是所有的“時候”都是好的“時機”。從這個W開始,我們將會加入對于成本的顧慮,也正是因為“成本”的存在,才使得下面的討論,變得有意義。
所有的開銷,都是有成本的。構(gòu)建成“程序”的源代碼,也是由工程師寫出來的。那么需要考慮這個過程中的成本?;谶@個考慮,在能夠比較穩(wěn)定的構(gòu)建“程序”的時候,不需要花費太多開銷在“源代碼”的時候,就是開展自動化測試的好時機。這個開銷包括編寫和修改源代碼,而源代碼指的是構(gòu)建出用來做自動化測試的程序的源代碼。
- WHERE, 在什么地方進行自動化測試
自動化測試的執(zhí)行,依靠的是機器。那么自動化測試必將在“機器”上進行。一般來說,這個機器包括桌面電腦和服務(wù)器。通過將寫好的源代碼部署在機器上,構(gòu)建出用來做自動化測試的"程序",并且運行該程序,實現(xiàn)自動化測試。
- WHICH, 對什么目標進行自動化測試
自動化測試的目標,是被測試的軟件。拋開人工智能的成分,手工測試必將在“人工智能”足夠普及和足夠“智能”之前,替代一大部分不需要“人類智能”的手工測試;以及自動化測試會做一些手工測試無法實施的,或者手工測試無法覆蓋的測試。
- 不需要“人類智能”的普通手工測試
- 界面的普通操作
- 通過固定輸入和固定操作而進行的流程化測試
- 重復(fù)的普通測試
- 手工測試無法實施或者覆蓋的
- 大量的數(shù)據(jù)的輸入
- 大量的步驟的操作
- 源代碼基本的測試
- 系統(tǒng)模塊間接口的調(diào)用測試
- ……
- HOW, 如何開展自動化測試
和所有的其他測試一樣,自動化測試的流程也是由“用例”執(zhí)行和“缺陷”驗證組成。差別是需要找到合適的“工具”來替代“人手”。不同目標的自動化測試有不同的測試工具,但是任何工具都無不例外的需要“編程”的過程,實現(xiàn)“源代碼”,也可以稱之為測試腳本。于是開展自動化測試的方式基本上如下:
- 準備測試用例
- 找到合適的自動化測試工具
- 用準確的編程形成測試腳本
- 在測試腳本中對目標進行“檢查”,即做斷言
- 記錄測試日志,生成測試結(jié)果
自動化測試的典型金字塔原理(如有更多關(guān)于自動化測試的問題,歡迎進Q群:698224407交流)
談到自動化測試,就不得不提的一個人和概念就是:Martin Fowler和他的金字塔原理。首先請看金字塔原理的圖示如下:
該圖說明了三個問題:
- 自動化測試包括三個方面:UI前端界面,Service服務(wù)契約和Unit底層單元
- 越是底層的測試,運行速度越快,時間開銷越少,金錢開銷越少
- 越是頂層的測試,運行速度越慢,時間開銷越多,金錢開銷越多
這是理想中的金字塔原理。
在實際的項目中,尤其是結(jié)合國內(nèi)的項目實踐,其實還隱藏了另一個問題:越是頂層的測試,效果越明顯。有句話說“貴的東西,除了貴,其他都是好的!”能夠很清晰的闡述這個觀點。
金字塔原理在國內(nèi)的適應(yīng)性也有一定的問題
- 自動化測試的起步不是特別早
- 甚至軟件測試很長一段時間都在進行基于業(yè)務(wù)的手工測試,測試人員的代碼能力相對較弱
- 開發(fā)人員在代碼中不太習(xí)慣寫單元測試
- 近些年基于服務(wù)契約的API測試也在興起
相對來說,在基于UI前端界面的自動化測試反倒是開展和實施的不是特別多。盡管基于界面的測試帶來的效果還是能夠立竿見影的。對于產(chǎn)品的質(zhì)量提升,還是比較容易有保證。
- 自動化測試的適用范圍
自動化測試可以涉及和試用的范圍主要在以下方面:
- 基于Web UI的瀏覽器應(yīng)用的界面測試
- 基于WebService或者WebAPI的服務(wù)契約測試
- 基于WCF、.net remoting、Spring等框架的服務(wù)的集成測試
- 基于APP UI的移動應(yīng)用界面測試
- 基于Java、C#等編程文件進行的單元測試
本文集中討論第一條:基于Web UI的瀏覽器應(yīng)用的界面測試。界面的改動對于測試來說,具有較大的成本風(fēng)險。主要考慮以下方面:
- 任務(wù)測試明確,不會頻繁變動
- 每日構(gòu)建后的測試驗證
- 比較頻繁的回歸測試
- 軟件系統(tǒng)界面穩(wěn)定,變動少
- 需要在多平臺上運行的相同測試案例、組合遍歷型的測試、大量的重復(fù)任務(wù)
- 軟件維護周期長
- 項目進度壓力不太大
- 被測軟件系統(tǒng)開發(fā)比較規(guī)范,能夠保證系統(tǒng)的可測試性
- 具備大量的自動化測試平臺
- 測試人員具備較強的編程能力
- 自動化測試的流程
自動化測試和普通的手工測試遵循的測試流程,與項目的具體實踐相關(guān)。一般來說,也是需要從測試計劃開始涉及自動化測試的。
- 測試計劃:劃定自動化測試的范圍包含哪些需求,涉及到哪些測試過程
- 測試策略:確定自動化測試的工具、編程方案、代碼管理、測試重點
- 測試設(shè)計:使用測試設(shè)計方法對被測試的需求進行設(shè)計,得出測試的測試點、用例思維導(dǎo)圖等
- 測試實施:根據(jù)測試設(shè)計進行用例編寫,并且將測試用例用編程的方式實現(xiàn)測試腳本
- 測試執(zhí)行:執(zhí)行測試用例,運行測試腳本,生成測試結(jié)果
1.2 自動化測試工具
基于Web UI的自動化測試工具主要有兩大類:付費的商業(yè)版工具和免費使用的開源版工具。典型的有兩種:
- UFT,QTP被惠普收購以后的新名稱。
- 通過程序的錄制,可以實現(xiàn)測試的編輯
- 錄制的測試腳本是 VBScript 語法
- 成熟版的商業(yè)付費工具
- 工具比較龐大,對具體的項目定制測試有難度
- SELENIUM,本次選擇的開源工具
- 本身不是測試工具,只是模擬瀏覽器操作的工具
- 背后有 Google 維護源代碼
- 支持全部主流的瀏覽器
- 支持主流的編程語言,包括:Java、Python、C#、PHP、Ruby、JavaScript等
- 工具很小,可以實現(xiàn)對測試項目的定制測試方案
- 基于標準的 WebDriver 語法規(guī)范
1.2.1 Selenium 基本介紹
Selenium`是開源的自動化測試工具,它主要是用于Web 應(yīng)用程序的自動化測試,不只局限于此,同時支持所有基于web 的管理任務(wù)自動化。
- Selenium官網(wǎng)的介紹
Selenium is a suite of tools to automate web browsers across many platforms.
- runs in many browsers and operating systems
- can be controlled by many programming languages and testing frameworks.
- Selenium 官網(wǎng):http://seleniumhq.org/
- Selenium Github 主頁:https://github.com/SeleniumHQ/selenium
Selenium 是用于測試 Web 應(yīng)用程序用戶界面 (UI) 的常用框架。它是一款用于運行端到端功能測試的超強工具。您可以使用多個編程語言編寫測試,并且 Selenium 能夠在一個或多個瀏覽器中執(zhí)行這些測試。
Selenium 經(jīng)歷了三個版本:Selenium 1,Selenium 2 和 Selenium 3。Selenium 也不是簡單一個工具,而是由幾個工具組成,每個工具都有其特點和應(yīng)用場景。
Selenium 誕生于 2004 年,當(dāng)在 ThoughtWorks 工作的 Jason Huggins 在測試一個內(nèi)部應(yīng)用時。作為一個聰明的家伙,他意識到相對于每次改動都需要手工進行測試,他的時間應(yīng)該用得更有價值。他開發(fā)了一個可以驅(qū)動頁面進行交互的 Javascript 庫,能讓多瀏覽器自動返回測試結(jié)果。那個庫最終變成了 Selenium 的核心,它是 Selenium RC(遠程控制)和 Selenium IDE 所有功能的基礎(chǔ)。Selenium RC 是開拓性的,因為沒有其他產(chǎn)品能讓你使用自己喜歡的語言來控制瀏覽器。這就是 Selenium 1。
然而,由于它使用了基于 Javascript 的自動化引擎,而瀏覽器對 Javascript 又有很多安全限制,有些事情就難以實現(xiàn)。更糟糕的是,網(wǎng)站應(yīng)用正變得越來越強大,它們使用了新瀏覽器提供的各種特性,都使得這些限制讓人痛苦不堪。
在 2006 年,一名 Google 的工程師, Simon Stewart 開始基于這個項目進行開發(fā),這個項目被命名為 WebDriver。此時,Google 早已是 Selenium 的重度用戶,但是測試工程師們不得不繞過它的限制進行工具。Simon 需要一款能通過瀏覽器和操作系統(tǒng)的本地方法直接和瀏覽器進行通話的測試工具,來解決Javascript 環(huán)境沙箱的問題。WebDriver 項目的目標就是要解決 Selenium 的痛點。
到了 2008 年,Selenium 和 WebDriver 兩個項目合并。Selenium 有著豐富的社區(qū)和商業(yè)支持,但 WebDriver 顯然代表著未來的趨勢。兩者的合并為所有用戶提供了一組通用功能,并且借鑒了一些測試自動化領(lǐng)域最閃光的思想。這就是 Selenium 2。
2016 年,Selenium 3 誕生。移除了不再使用的 Selenium 1 中的 Selenium RC,并且官方重寫了所有的瀏覽器驅(qū)動。
- Selenium 工具集
- Selenium IDE
Selenium IDE (集成開發(fā)環(huán)境) 是一個創(chuàng)建測試腳本的原型工具。它是一個 Firefox 插件,實現(xiàn)簡單的瀏覽器操作的錄制與回放功能,提供創(chuàng)建自動化測試的建議接口。Selenium IDE 有一個記錄功能,能記錄用戶的操作,并且能選擇多種語言把它們導(dǎo)出到一個可重用的腳本中用于后續(xù)執(zhí)行。
- Selenium RC
Selenium RC 是selenium 家族的核心工具,Selenium RC 支持多種不同的語言編寫自動化測試腳本,通過selenium RC 的服務(wù)器作為代理服務(wù)器去訪問應(yīng)用從而達到測試的目的。
selenium RC 使用分Client Libraries 和Selenium Server。
- Client Libraries 庫主要主要用于編寫測試腳本,用來控制selenium Server 的庫。
- Selenium Server 負責(zé)控制瀏覽器行為,總的來說,Selenium Server 主要包括3 個部分:Launcher、Http Proxy、Core。
- Selenium Grid
Selenium Grid 使得 Selenium RC 解決方案能提升針對大型的測試套件或者哪些需要運行在多環(huán)境的測試套件的處理能力。Selenium Grid 能讓你并行的運行你的測試,也就是說,不同的測試可以同時跑在不同的遠程機器上。這樣做有兩個有事,首先,如果你有一個大型的測試套件,或者一個跑的很慢的測試套件,你可以使用 Selenium Grid 將你的測試套件劃分成幾份同時在幾個不同的機器上運行,這樣能顯著的提升它的性能。同時,如果你必須在多環(huán)境中運行你的測試套件,你可以獲得多個遠程機器的支持,它們將同時運行你的測試套件。在每種情況下,Selenium Grid 都能通過并行處理顯著地縮短你的測試套件的處理時間。
- Selenium WebDriver
WebDriver 是 Selenium 2 主推的工具,事實上WebDriver是Selenium RC的替代品,因為Selenium需要保留向下兼容性的原因,在 Selenium 2 中, Selenium RC才沒有被徹底的拋棄,如果使用Selenium開發(fā)一個新的自動化測試項目,那么我們強烈推薦使用Selenium2 的 WebDriver進行編碼。另外, 在Selenium 3 中,Selenium RC 被移除了。
- Python 語言的選擇,便捷
- 測試人員的編程能力普遍不是很強,而Python作為一種腳本語言,不僅功能強大,而且語法優(yōu)美,支持多種自動化測試工具,而且學(xué)習(xí)上手比較容易。
- Python的社區(qū)發(fā)展比較好,有著非常多的文檔和支持庫,另外Python也可以在Web開發(fā)、數(shù)據(jù)處理、科學(xué)計算等縱多領(lǐng)域有著非常好的應(yīng)用前景。
- 對于有一定編程基礎(chǔ)的人員,使用Python作為自動化測試的語言可以非常順暢的轉(zhuǎn)換,幾乎沒有學(xué)習(xí)成本。同時Python是標準的面向?qū)ο蟮木幊陶Z言,對于C#、Java等面向?qū)ο蟮恼Z言有著非常好的示例作用,通過Python的示例可以非常輕松的觸類旁通,使用其他語言進行Selenium2.0的WebDriver的使用。
- 讀音:/'pa?θ?n/
- Python的創(chuàng)始人為Guido Van Rossum。1989年圣誕節(jié)期間,在阿姆斯特丹,Guido為了打發(fā)圣誕節(jié)的無趣,決心開發(fā)一個新的腳本解釋程序,做為ABC 語言的一種繼承。之所以選中Python(大蟒蛇的意思)作為程序的名字,是因為他是一個叫Monty Python的喜劇團體的愛好者。
- Python 語言除了在自動化測試領(lǐng)域有出色的表現(xiàn)外,在系統(tǒng)編程,網(wǎng)絡(luò)編程,web 開發(fā),GUI開發(fā),科學(xué)計算,游戲開發(fā)等多個領(lǐng)域應(yīng)用非常廣泛,而且具有非常良好的社區(qū)支持。也就是說學(xué)習(xí)和掌握python 編程,其實是為你打開了一道更廣闊的大門。
- 使用的工具集
- IDE: Jetbrains PyCharm
- 語言: Python
- 工具: Selenium WebDriver
- 源代碼管理: SVN/Git
1.2.2 JetBrains PyCharm 使用
- JetBrains PyCharm 的介紹
PyCharm 是 JetBrains 公司針對Python推出的IDE(Integrated Development Environment,集成開發(fā)環(huán)境)。是目前最好的Python IDE之一。目前包含了兩個版本:
- 社區(qū)版,Community Edition
- 專業(yè)版,Professional Edition
- 付費
- 比社區(qū)版主要多了Web開發(fā)框架
我們推薦使用免費的社區(qū)版本,進行Python腳本的編寫和自動化測試執(zhí)行。
PyCharm可以在官網(wǎng)下載,http://www.jetbrains.com
PyCharm 安裝后,如果也安裝過 Python 環(huán)境,可以直接進行操作。否則請在 1.2.3 中安裝好 Python,再使用 PyCharm。
- 安裝按照默認的步驟安裝
- 使用方式
- Create New Project:
創(chuàng)建新的項目,選擇項目創(chuàng)建的位置,選擇Python的解釋器
- 設(shè)置location,項目的路徑和名稱
- 名稱必須以英文字母開頭
- 名稱不可以有空格
- 位置不可以在 C:Pytho34中,應(yīng)該放到普通的目錄中
- 設(shè)置interpreter
- 一個電腦可以裝多個 Python
- 這里選擇一個你需要的 Pythpn
新建Python文件
在創(chuàng)建的文件中編寫第一個Python語句
print("hello Python!")
右鍵該文件,選擇Run hello,運行該語句,在下面的運行框中會顯示運行結(jié)果
C:Python35python.exe D:/Git/WeekendSelenium/untitled/hello.py hello python! Process finished with exit code 0
如圖
- Open
打開已經(jīng)存在的項目,比如別人發(fā)給你的項目,或者已經(jīng)創(chuàng)建過的項目
- 安裝后進行設(shè)置如下:
- 設(shè)置行號的顯示
在PyCharm 里,顯示行號有兩種辦法:
- 臨時設(shè)置(不推薦)。右鍵單擊行號處,選擇 Show Line Numbers。
但是這種方法,只對一個文件有效,并且,重啟PyCharm 后消失。
- 永久設(shè)置。File --> Settings -->Editor -->Appearance , 之后勾選Show Line Numbers。
- 設(shè)置字體
選擇 Settings | Editor | Colors & Fonts | Fonts
Save AS 主題
選擇 Source Code Pro(建議選擇,等寬字體)
- SVN / Git 在工具中的集成
源代碼管理工具(VCS, version control system)
如果TortoiseSVN版本低于 1.8,需要先升級安裝1.8以上的版本
選擇SVN(git)作為代碼的源代碼管理工具。集成在PyCharm中的步驟如下
- 代碼已經(jīng)存在在SVN repo中:把代碼放到SVN在本地簽出(check out)的文件夾目錄中,例如 D:SVNXXProjectTrunck
- 代碼沒有創(chuàng)建:在本地的SVN項目文件夾中新建項目,用PyCharm打開,提交。
- 用PyCharm打開 剛剛部署的代碼
- 選擇PyCharm的 VCS|Enable VCS integration,選擇 Subversion(svn) 或者 Git
- 右鍵項目文件的根目錄,選擇 Subversion | add to VCS
- 右鍵項目文件的根目錄,或者選 VCS | Commit Directory...
- 每天打開代碼后,右鍵項目文件的根目錄,首先 Subversion | update project
- 如果有沖突,先本地手工保存你做的修改(備份你的文件到其他地方,SVN目錄之外的地方,然后Revert)
1.2.3 Selenium 的環(huán)境搭建
- 在 Windows 搭建和部署 Selenium 工具
主要包括兩個步驟:
- 安裝 Python 語言
Python的官方網(wǎng)站:http://www.python.org
Python 目前并行了兩套版本,2.x 和 3.x。如果你之前沒有 Python 的使用經(jīng)驗,建議使用 Python 3.x 版本。兩套版本互相不兼容,并且 Python 從 3.5(含)開始,不再支持 Windows XP 系統(tǒng),請注意。
- 選擇安裝目錄
- 3.4或者3.4以下的版本,都是 C:python34
- 3.5以上的目錄,默認裝個人文件夾,建議用類似上面的目錄,比如C:python35
- 勾選添加環(huán)境變量
勾選Add Python.exe to PATH
- 安裝過程中不要關(guān)閉彈出來的命令行窗口
- 關(guān)于 Python 的安裝,也可以選擇一些第三方的Python 安裝包,典型的有 Anaconda3,這樣的包有豐富的第三方庫,在使用 Python 的過程中會更加方便。
Anaconda 的官網(wǎng):https://www.continuum.io/anaconda-overview
- 安裝 Selenium 工具包
由于 安裝好的 Python 默認有 pip Python 包管理工具,可以通過 pip 非常方便的安裝 Selenium。
- 啟動命令行工具:Win+R | 輸入 cmd | 回車
- 輸入命令:
pip install selenium
該命令的執(zhí)行需要有互聯(lián)網(wǎng)聯(lián)網(wǎng)環(huán)境。此外該命令有以下幾種選項可以使用
- 安裝指定的版本,例如安裝指定的 Selenium 3.4.3
pip install selenium==3.4.3
- 安裝最新版的 Selenium
pip install -U selenium # -U 也可以用 --upgrade pip install --upgrade selenium
- 卸載安裝當(dāng)前的 Selenium
pip uninstall selenium
- 當(dāng)然,如果您的機器處于非接入互聯(lián)網(wǎng)的環(huán)境,您可以事先下載 Selenium 的 Python 安裝包,再進行手動安裝。
- 官方下載地址:https://pypi.python.org/pypi/selenium
- 上述地址會下載最新版的 Selenium,目前最先版的是 3.4.3,您也可以根據(jù)以下路徑下載指定的 3.4.3
- Selenium 3.4.3 下載地址:https://pypi.python.org/pypi/selenium/3.4.3#downloads
- 下載后,解壓該壓縮包
- 然后用命令行進入該壓縮包的根目錄,輸入命令進行安裝
python setup.py install
- 配置 瀏覽器 和 驅(qū)動
- Selenium 2 可以默認支持Firefox 46.0或者更低版本,對于其他瀏覽器需要額外安裝驅(qū)動。
- Selenium 3 對于所有的瀏覽器都需要安裝驅(qū)動,本文以 Chrome 和 Firefox、IE為例設(shè)置瀏覽器和驅(qū)動。
- ChromeDriver下載地址:http://chromedriver.storage.googleapis.com/index.html
- ChromeDriver 與 Chrome 對應(yīng)關(guān)系表:
ChromeDriver版本支持的Chrome版本v2.31v58-60v2.30v58-60v2.29v56-58v2.28v55-57v2.27v54-56v2.26v53-55v2.25v53-55v2.24v52-54v2.23v51-53v2.22v49-52v2.21v46-50v2.20v43-48
- GeckoDriver下載地址:https://github.com/mozilla/geckodriver/releases
- GeckoDriver 與 Firefox 的對應(yīng)關(guān)系表:
GeckoDriver版本支持的Firefox版本v0.18.0v56v0.17.0v55v0.16.0v54,需要Selenium 3.4或者以上v0.15.0v53,需要Selenium 3.3或者以上
- IEDriverServer下載地址:http://selenium-release.storage.googleapis.com/index.html
- IEDriverServer 的版本需要與 Selenium 保持嚴格一致。
- 瀏覽器驅(qū)動的配置
- 首先,將下載好的對應(yīng)版本的瀏覽器安裝。
- 其次,在 Python 的根目錄中,放入瀏覽器驅(qū)動。
- 最好再重啟電腦,一般情況下不重啟也可以的。
1.3 Selenium 的最簡腳本
通過上一節(jié)的環(huán)境安裝成功以后,我們可以進行第一個對Selenium 的使用,就是最簡腳本編寫。腳本如下:
# 聲明一個司機,司機是個Chrome類的對象 driver = webdriver.Chrome() # 讓司機加載一個網(wǎng)頁 driver.get("http://demo.ranzhi.org") # 給司機3秒鐘去打開 sleep(3) # 開始登錄 # 1. 讓司機找用戶名的輸入框 we_account = driver.find_element_by_css_selector('#account') we_account.clear() we_account.send_keys("demo") # 2. 讓司機找密碼的輸入框 we_password = driver.find_element_by_css_selector('#password') we_password.clear() we_password.send_keys("demo") # 3. 讓司機找 登錄按鈕 并 單擊driver.find_element_by_css_selector('#submit').click() sleep(3)
實際上一段20行的代碼,也不能算太少了。但是這段代碼的使用,確實體現(xiàn)了 Selenium 的最簡單的使用。我們在下面內(nèi)容進行闡述。
- 關(guān)于面向?qū)ο缶幊?/li>
通過前面的介紹,我們知道 Selenium 支持多種語言,并且推薦使用面向?qū)ο蟮姆绞竭M行編程。接下來我們將著重介紹如何使用面向?qū)ο蟮姆绞竭M行編程。
我們利用 Python 進行面向?qū)ο缶幊蹋枰紫攘私庖粋€概念:類
- 類
類是任何面向?qū)ο缶幊痰恼Z言的基本組成,描述了使用的基本方法。我們可能在目前,還不是特別明白類的含義,但是我們可以通過類的使用,來進一步了解。
- 類的使用
類,通過實例化進行使用。比如有一個類: Driver,該類有一個方法: head(road)
那么關(guān)于這個類的使用,只需要兩個步驟:
- 實例化該類:d = Driver()
- 調(diào)用類的方法:d.head("中山路")
- 了解上述例子和使用以后,我們來看具體的 Selenium 的使用。
- 具體的對象的使用
在面向?qū)ο蟮睦砟羁磥?,任何的編碼,都是由對象而來的,這里也不例外。和之前介紹 WebDriver 時候的描述對應(yīng),我們需要用到兩種主要的類,并將其實例化。
- WebDriver 類:主要靠直接實例化該類為對象,然后用其對象直接調(diào)用該類的方法和屬性
- WebElement 類:主要通過 WebDriver 類實例化的對象,通過對頁面元素的查找,得到 WebElement 類的對象,然后調(diào)用該類的方法和屬性。
上述代碼中,使用了一個 WebDriver 類 的對象,即第2行,聲明了該類的對象,并賦值給變量 driver,接著變量 driver 作為 WebDriver 類的對象,使用了多個 WebDriver 類的方法。
注意:Chrome 是 WebDriver 的子類,是 WebDriver 類的一種
- get(url): 第5行,打開網(wǎng)址
- find_element_by_css_selector(selector): 第12、17、22行都使用了該方法,同時通過對該方法的調(diào)用,分別各產(chǎn)生了一個 WebElement類的對象,we_account,we_password和最后一個匿名的對象,并通過產(chǎn)生的三個對象,調(diào)用 WebElement 類的方法
- clear():清理頁面元素中的文字
- send_keys(text):給頁面元素中,輸入新的文字
- click():鼠標左鍵點擊頁面元素
正是通過這樣的面向?qū)ο蟮姆绞?,產(chǎn)生 Web司機(WebDriver類的對象),并且通過 Web司機不懈的努力,尋找到各種 Web元素(WebElement類的對象)進行操作,這樣便實現(xiàn)了 Selenium WebDriver 作為一款出色的瀏覽器測試工具,進行瀏覽器UI界面的自動化測試的代碼編寫和用例執(zhí)行。
1.4 Selenium WebDriver API 的使用
通過上述最簡腳本的使用,我們可以來進一步了解 Selenium 的使用。事實上,上一節(jié)用的,便是 Selenium 的 WebDriver API。API(Application Programming Interface,應(yīng)用程序編程接口,即通過編程語言,操作 WebDriver 的方法集合)
Selenium WebDriver API 官方參考:http://seleniumhq.github.io/selenium/docs/api/py/
具體API文檔地址:https://seleniumhq.github.io/selenium/docs/api/py/api.html
- API 使用: 用現(xiàn)成的類(大部分情況)的方法進行編程
- WebDriver
- WebElement
- API 文檔
- 編程使用說明
- 介紹了每個方法的使用
- 方法的作用
- 方法的參數(shù)
- 方法的返回值
1.4.1 控制瀏覽器
瀏覽器的控制也是自動化測試的一個基本組成部分,我們可以將瀏覽器最大化,設(shè)置瀏覽器的高度和寬度以及對瀏覽器進行導(dǎo)航操作等。
1.4.2 元素定位操作
WebDriver提供了一系列的定位符以便使用元素定位方法。常見的定位符有以下幾種:
- id
- name
- class name
- tag
- link text
- partial link text
- xpath
- css selector
那么我們以下的操作將會基于上述的定位符進行定位操作。
對于元素的定位,WebDriver API可以通過定位簡單的元素和一組元素來操作。在這里,我們需要告訴Selenium如何去找元素,以至于他可以充分的模擬用戶行為,或者通過查看元素的屬性和狀態(tài),以便我們執(zhí)行一系列的檢查。
在Selenium2中,WebDriver提供了多種多樣的find_element_by方法在一個網(wǎng)頁里面查找元素。這些方法通過提供過濾標準來定位元素。當(dāng)然WebDriver也提供了同樣多種多樣的find_elements_by的方式去定位多個元素。
盡管上述的方式,可以進行元素定位,實際上我們也是更多的用組合的方式進行元素定位。
方法Method描述Description參數(shù)Argument示例Exampleid該方法通過ID的屬性值去定位查找單個元素id: 需要被查找的元素的IDfind_element_by_id('search')name該方法通過name的屬性值去定位查找單個元素name: 需要被查找的元素的名稱find_element_by_name('q')class name該方法通過class的名稱值去定位查找單個元素class_name: 需要被查找的元素的類名find_element_by_class_name('input-text')tag_name該方法通過tag的名稱值去定位查找單個元素tag: 需要被查找的元素的標簽名稱find_element_by_tag_name('input')link_text該方法通過鏈接文字去定位查找單個元素link_text: 需要被查找的元素的鏈接文字find_element_by_link_text('Log In')partial_link_text該方法通過部分鏈接文字去定位查找單個元素link_text: 需要被查找的元素的部分鏈接文字find_element_by_partial_link_text('Long')xpath該方法通過XPath的值去定位查找單個元素xpath: 需要被查找的元素的xpathfind_element_by_xpath('//*[@id="xx"]/a')css_selector該方法通過CSS選擇器去定位查找單個元素css_selector: 需要被查找的元素的IDfind_element_by_css_selector('#search')
接下來的列表將會詳細展示find_elements_by的方法集合。這些方法依據(jù)匹配的具體標準返回一系列的元素。
方法Method描述Description參數(shù)Argument示例Exampleid該方法通過ID的屬性值去定位查找多個元素id: 需要被查找的元素的IDfind_elements_by_id('search')name該方法通過name的屬性值去定位查找多個元素name: 需要被查找的元素的名稱find_elements_by_name('q')class_name該方法通過class的名稱值去定位查找多個元素class_name: 需要被查找的元素的類名find_elements_by_class_name('input-text')tag_name該方法通過tag的名稱值去定位查找多個元素tag: 需要被查找的元素的標簽名稱find_elements_by_tag_name('input')link_text該方法通過鏈接文字去定位查找多個元素link_text: 需要被查找的元素的鏈接文字find_elements_by_link_text('Log In')partial_link_text該方法通過部分鏈接文字去定位查找多個元素link_text: 需要被查找的元素的部分鏈接文字find_elements_by_partial_link_text('Long')xpath該方法通過XPath的值去定位查找多個元素xpath: 需要被查找的元素的xpathfind_elements_by_xpath("http://div[contains(@class,'list')]")css_selector該方法通過CSS選擇器去定位查找多個元素css_selector: 需要被查找的元素的IDfind_element_by_css_selector('.input_class')
依據(jù)ID查找
請查看如下HTML的代碼,以便實現(xiàn)通過ID的屬性值去定義一個查找文本框的查找:
根據(jù)上述代碼,這里我們使用find_element_by_id()的方法去查找搜索框并且檢查它的最大長度maxlength屬性。我們通過傳遞ID的屬性值作為參數(shù)去查找,參考如下的代碼示例:
如果使用find_elements_by_id()方法,將會返回所有的具有相同ID屬性值的一系列元素。
依據(jù)名稱name查找
這里還是根據(jù)上述ID查找的HTML代碼,使用find_element_by_name的方法進行查找。參考如下的代碼示例:
同樣,如果使用find_elements_by_name()方法,將會返回所有的具有相同name屬性值的一系列元素。
依據(jù)class name查找
除了上述的ID和name的方式查找,我們還可以使用class name的方式進行查找和定位。
事實上,通過ID,name或者類名class name查找元素是最提倡推薦的和最快的方式。當(dāng)然Selenium2 WebDriver也提供了一些其他的方式,在上述三類方式條件不足,查找無效的時候,可以通過這些其他方式來查找。這些方式將會在后續(xù)的內(nèi)容中講述。
請查看如下的HTML代碼,通過改代碼進行練習(xí)和理解。
根據(jù)上述代碼,使用find_element_by_class_name()方法去定位元素。
同樣的如果使用find_elements_by_class_name()方法去定位元素,將會返回所有的具有相同name屬性值的一系列元素。
依據(jù)標簽名tag name查找
利用標簽的方法類似于利用類名等方法進行查找。我們可以輕松的查找出一系列的具有相同標簽名的元素。例如我們可以通過查找表中的
下面有一個HTML的示例,這里在無序列表中使用了標簽。
這里面我們使用find_elements_by_tag_name()的方式去獲取全部的圖片,在此之前,我們將會使用find_element_by_class_name()去獲取到指定的
- 。
- 什么是封裝
- 使用成本低
- 不需要要求所有的測試工程師會熟練使用Selenium,而只需要會使用封裝以后的代碼
- 不需要對所有的測試工程師進行完整培訓(xùn)。也避免工作交接的成本。
- 測試人員使用統(tǒng)一的代碼庫
- 維護成本低
- 通過封裝,在代碼發(fā)生大范圍變化和遷移的時候,不需要維護所有代碼,只需要變更封裝的部分即可
- 維護代碼不需要有大量的工程師,只需要有核心的工程師進行封裝的維護即可
- 代碼安全性
- 對作為第三方的Selenium進行封裝,是代碼安全的基礎(chǔ)。
- 對于任何的代碼的安全隱患,必須由封裝來解決,使得風(fēng)險可控。
- 使用者并不知道封裝內(nèi)部的代碼結(jié)構(gòu)。
- [探討]單元測試在敏捷開發(fā)的場景下對技術(shù)和產(chǎn)品的影響?
- 技術(shù)人員需要掌握的技術(shù)棧
- 企業(yè)產(chǎn)品的質(zhì)量度量與提升
具體代碼如下:
依據(jù)鏈接文字link查找
鏈接文字查找通常比較簡單。使用find_element_by_link_text請查看以下示例
測試代碼如下:
依據(jù)部分鏈接文字partial text查找
這里依舊使用上述的列子進行代碼編寫:
1.6 為什么需要封裝 Selenium
封裝是一個面向?qū)ο缶幊痰母拍?,是面向?qū)ο缶幊痰暮诵膶傩裕ㄟ^將代碼內(nèi)部實現(xiàn)進行密封和包裝,從而簡化編程。對Selenium進行封裝的好處主要有如下三個方面:
自動化測試在路上
最新內(nèi)容
學(xué)習(xí)python需要做哪些準備?
沒有什么特別的準備,一臺能正常運行的電腦就行,Windows、Linux、Mac均可,作為一門跨平臺的腳本語言,Python對于實際平臺(系統(tǒng))并沒有什么挑剔,下面我簡單介紹一下Python的學(xué)習(xí)過 ...
西安軟件測試培訓(xùn)班學(xué)費是多少?
在西安想學(xué)軟件測試,如果是想?yún)⒓优嘤?xùn)班進行學(xué)習(xí),那學(xué)費一般在1-3W之間,不同的培訓(xùn)機構(gòu),可能學(xué)費也會不同,但是我覺得一般在2W左右就是一個比較合理的范疇。當(dāng)然,很多培訓(xùn) ...
西安軟件測試培訓(xùn)學(xué)??孔V嗎?
結(jié)合自己就業(yè)后遇到的小伙伴來看,在西安靠譜的軟件測試培訓(xùn)學(xué)校還是有的,畢竟大家學(xué)完出來后,都能勝任現(xiàn)在的工作,說明還是學(xué)到了真正的技術(shù)。當(dāng)然培訓(xùn)行業(yè)本就魚珠混雜, ...
西安軟件測試就業(yè)怎么樣?
隨著互聯(lián)網(wǎng)行業(yè)的飛速發(fā)展,企業(yè)越來越注重軟件質(zhì)量,及軟件產(chǎn)品給用戶帶來的體驗,因此,為軟件產(chǎn)品質(zhì)量保駕護航的軟件測試工程師崗位受到了各企業(yè)的重視。隨著各企業(yè)對軟件 ...
西安哪家軟件測試培訓(xùn)機構(gòu)好?
要說哪家培訓(xùn)機構(gòu)好,在我看來靠譜的培訓(xùn)機構(gòu)就是好的。只要靠譜能夠?qū)W到知識和技術(shù),能夠找到自己滿意的工作,那就實現(xiàn)了自己參加培訓(xùn)機構(gòu)的目的。每個人的需求不同,對培訓(xùn) ...
西安軟件測試培訓(xùn)多少錢?
在西安,軟件測試培訓(xùn)學(xué)校有很多,其培訓(xùn)學(xué)費一般在10000-20000元之間。當(dāng)然選培訓(xùn)學(xué)校,我們除了學(xué)費更看中這個培訓(xùn)學(xué)校是否靠譜,只有選擇了靠譜的培訓(xùn)學(xué)校,在今后的學(xué)習(xí)過程中 ...
2020畢業(yè)季,乘風(fēng)破浪,與你同行!
在今天的文章開始之前,先說好啊,匯智妹今天是來送福利的! 別以為只有報名學(xué)習(xí)才有份,你動動小手,精美禮物就是你的! 不過在這之前,看完文章先~ ...
想做程序員,需要學(xué)習(xí)哪些知識?
如果你想成為程序員大佬,千萬不要過早設(shè)定自己的方向,因為專業(yè)的程序員都是能夠把很多個方向做的很牛逼,而且其中有一兩個方向是超級牛逼的。分享幾點我同學(xué)學(xué)編程的途徑: ...

