手把手教您認識、搭建和使用Selenium WebDriver
譯文【51CTO.com快譯】Selenium是用于Web應用程序測試的最廣泛的自動化框架之一。它可以通過自動執(zhí)行瀏覽器測試,以簡化我們花費在質量檢查上的人工測試工作。Selenium WebDriver是Selenium套件中的一個關鍵組件。本文將和您討論什么是Selenium WebDriver、它的架構組成、如何搭建自動化測試、以及一個簡單示例。
什么是Selenium?
作為一個開源的自動化測試框架,Selenium可以在不同的瀏覽器和平臺上執(zhí)行應用測試。其主要特征包括:
- Selenium支持包括:Java、Python、C#、JavaScript、Ruby、PHP和Perl在內的多種編程語言。
- Selenium測試可以在諸如:Firefox、Chrome、Internet Explorer、Safari、以及Opera等多種瀏覽器上執(zhí)行。
- Selenium與平臺無關,也就是說,如果您在Windows系統(tǒng)上編寫的Selenium測試,完全可以被輕松地執(zhí)行在Linux或macOS上。
- Selenium具有廣泛的社區(qū),可以隨時獲得各種技術支持。
- 并行測試是Selenium的主要功能之一。
Selenium的組成
如前所述,由于Selenium是一個框架,而不是單個軟件,因此它是由不同組件所組成的套件。如下圖所示,Selenium套件具有四個主要部分:
Selenium IDE
Selenium IDE(集成開發(fā)環(huán)境)是一種簡單易學的框架。它可以作為Mozilla Firefox和Google Chrome的瀏覽器插件。您無需具備任何編程語言方面的經(jīng)驗,即可使用該IDE。通過它提供的記錄和回放方法,您可以記錄測試的步驟,并導入自己的首選編程語言,進而使用Selenium WebDriver來開展各項測試。因此,為了創(chuàng)建測試原型,您可以從Selenium官方網(wǎng)站-- https://www.selenium.dev/selenium-ide/,下載Selenium IDE。
Selenium RC
Selenium RC是一種服務器,它讓用戶能夠用任何被支持的語言,來創(chuàng)建測試腳本。與Selenium IDE不同,它沒有記錄和回放功能,但支持并行和遠程的方式被執(zhí)行。作為Selenium1.0,它自身的諸多限制與缺陷,直接催生了Selenium WebDriver。
Selenium WebDriver
Selenium WebDriver克服了Selenium RC的局限性。與Selenium RC不同的是,Selenium WebDriver不需要依賴JavaScript,即可通過直接通信來控制瀏覽器。與IDE和RC相比,它具有更快的執(zhí)行時間,有時也被稱為Selenium 2.0。鑒于其強大的功能,Selenium WebDriver被廣泛地使用在創(chuàng)建自動測試用例的場景中。
Selenium Grid
通過與Selenium RC的配合使用,Selenium Grid能夠方便用戶在不同的瀏覽器和計算機上執(zhí)行并行測試。也就是說,用戶可以在多個環(huán)境中同時運行并行測試,進而節(jié)省了大量的時間。Selenium Grid啟用了集線器節(jié)點的概念,實現(xiàn)了每個節(jié)點都能夠從位于中心處的集線器上接收命令。
Selenium WebDriver與Selenium RC不同之處
Selenium WebDriver和Selenium RC之間的區(qū)別主要體現(xiàn)在如下方面:
架構上的差異
與Selenium RC相比,Selenium WebDriver的架構更簡單。WebDriver通過操作系統(tǒng)來控制瀏覽器。也就是說,在使用WebDriver時,您只需要將編程語言與瀏覽器的驅動程序綁定即可。而Selenium RC則要求在運行測試之前,先運行Selenium的遠程控制服務器。
Selenium RC實際上充當?shù)氖荢elenium代碼和瀏覽器之間的中間層,它能夠將Selenium Core(一種Javascript程序)注入瀏覽器,以便其內核通過RC服務器,接收由程序給出的指令。RC服務器在收到瀏覽器的響應后,會直接將結果顯示給最終用戶。
執(zhí)行速度上的差異
在Selenium RC中,每條指令都需要遵循冗長的處理過程,而在Selenium WebDriver中,它們可以通過直接交互,來縮短整個生命周期。具體而言:
- Selenium WebDriver直接與瀏覽器交互,并調用瀏覽器引擎來對其進行控制,因此執(zhí)行的速度非常快。
- Selenium RC需要首先將Selenium命令轉換為控制Web瀏覽器的Selenium Core,因此執(zhí)行的速度較慢。
互動上的差異
- Selenium WebDriver通過直接與Web瀏覽器通信,來模仿真實際使用中的交互。例如:如果某些Web元素被隱藏或禁用,那么WebDriver將無法像普通用戶那樣找到它們。
- Selenium RC使用與JavaScript代碼相似的Selenium Core。該核心可以訪問到被隱藏或禁用的元素。因此,即使我們使用Selenium RC在UI上禁用了某些文本框,用戶仍然可以進行輸入。
API上的差異
- Selenium RC的API命令較為復雜。例如,click、mouseDown、以及mouseDownAt三者很容易被引起混淆;而type與typeKeys也是如此。此外,不同的瀏覽器對這些命令的解釋也不盡相同。因此,在正確的位置選擇正確的命令,對于用戶來說成為了一項艱巨的任務。
- Selenium WebDriver的API則非常簡單易用。
對瀏覽器支持的差異
- Selenium WebDriver支持headless的HTMLUnit瀏覽器。此處的headless表示沒有UI顯示,各種命令會通過不可見的瀏覽器來執(zhí)行。
- Selenium RC并不支持headless瀏覽器。
Selenium WebDriver的架構
如上圖所示,Selenium WebDriver包含四個主要組件:
Selenium客戶庫/Selenium語言綁定
為了支持多種語言,Selenium開發(fā)人員已經(jīng)構建了各種語言綁定。也就是說,如果您正在用Java來編寫測試,那么就可以使用Java綁定。而且,這些客戶端的庫,完全可以從Selenium官方網(wǎng)站處進行下載。
JSON傳輸協(xié)議(Wire Protocol)
JSON是JavaScript Object Notation的縮寫形式。它能夠在客戶端和服務器之間傳輸數(shù)據(jù)。由于JSON能夠為對象和數(shù)組之類的數(shù)據(jù)結構提供支持,因此方便了數(shù)據(jù)的讀取和寫入。它往往充當REST API,實現(xiàn)HTTP服務器之間的信息傳輸。
瀏覽器驅動
為了與瀏覽器建立安全的連接,Selenium會用到驅動程序。每一種瀏覽器都會使用自己的驅動程序,來隱藏內部功能的邏輯。此外,每一種自動化語言也都有其對應的瀏覽器驅動。因此,各種腳本在被執(zhí)行時,通常:
- 每個Selenium命令都會生成一個相應的HTTP請求,該請求將會被發(fā)送到瀏覽器驅動程序處。
- 該請求會通過HTTP服務器進行路由。
- HTTP服務器在瀏覽器上,驅動指令的執(zhí)行。
- 瀏覽器將狀態(tài)發(fā)送回給HTTP服務器,并將其轉發(fā)給自動化腳本。
上文提到的瀏覽器驅動程序包括:ChromeDriver、GeckoDriver、以及IEDriver等。它們大多可以從GitHub存儲庫中被下載到。
瀏覽器
瀏覽器是我們執(zhí)行測試的終點。Selenium能夠支持諸如:Firefox、Chrome、Internet Explorer、以及Safari等主流瀏覽器。
Selenium WebDriver的下載、安裝和設置
下面,我們來看看如何使用Windows操作系統(tǒng),將Java作為編程語言,以Eclipse作為IDE,完成Selenium WebDriver的下載、安裝和設置。
安裝Java
步驟1:從Java官網(wǎng)--https://www.oracle.com/java/technologies/javase-jdk14-downloads.html查找并下載Windows 64位的JDK安裝程序。
步驟2:在彈出的窗口中接受許可協(xié)議,并單擊“下載”。
步驟3:完成后,請到下載文件夾中雙擊可執(zhí)行文件,以安裝Java。
設置環(huán)境變量
步驟1:打開電腦的設置,從“系統(tǒng)”對話框窗口中選擇“高級系統(tǒng)設置”。
步驟2:在彈出的窗口中單擊“環(huán)境變量”按鈕。
步驟3:在“系統(tǒng)變量”處雙擊“路徑”。
步驟4:根據(jù)系統(tǒng)對應的位置,添加Java安裝目錄的完整路徑,并單擊OK。
步驟5:驗證是否已安裝Java和正確地設置了變量。請打開“命令提示符”并鍵入:java -version。您將可以看到在系統(tǒng)中新安裝的Java版本。
安裝Eclipse
步驟1:從Eclipse官網(wǎng)--https://www.eclipse.org/downloads/packages/查找并下載適合Java開發(fā)人員專用的Eclipse IDE(最好是最新的穩(wěn)定版)。
步驟2:下載完成后,請其解壓縮到適當?shù)奈恢谩?/p>
步驟3:在生成的文件夾中雙擊eclipse.exe。
下載Selenium WebDriver并設置
步驟1:訪問Selenium官網(wǎng)--https://www.selenium.dev/downloads/。
步驟2:針對列表中的Selenium Client和WebDriver Language Bindings,請下載與自己語言首選項相對應的客戶端庫。本文以Java客戶端為例。
步驟3:將下載的文件解壓縮到某個目標文件夾中,以便后續(xù)使用。
步驟4:找到對應的目標文件夾。
步驟5:打開文件夾后,您將能夠看到一些jar文件,一個libs文件夾(其中包含了更多的jar文件)和一個Changelog文件。
步驟6:為瀏覽器下載驅動程序。下面是三大主流瀏覽器驅動的下載鏈接:
- GeckoDriver(Firefox)-- https://github.com/mozilla/geckodriver/releases
- InternetExplorerDriver-- https://selenium-release.storage.googleapis.com/index.html
- ChromeDriver-- https://sites.google.com/a/chromium.org/chromedriver/
您也可以通過參考Selenium網(wǎng)站上的“瀏覽器”部分,以下載更多瀏覽器驅動。
步驟7:解壓已下載的驅動,將其存放在到方便的位置。
為Selenium WebDriver配置Eclipse
步驟1:啟動eclipse.exe。
步驟2:手動選擇工作區(qū),或保持默認位置,然后單擊“確定”。
步驟3:根據(jù)向導,依次點擊“文件”->“新建”->“Java項目”,以創(chuàng)建一個新的項目。
步驟4:點擊“下一步”,為項目命名,并單擊完成。
步驟5:在新建的項目上右鍵,選擇“新建”->“包”。
步驟6:在“新建Java包”對話框中輸入包的名稱,然后單擊“完成”。
步驟7:右擊新建包的名稱,依次選擇“新建”->“類”。
步驟8:在“新建Java類”對話框中,輸入類的名稱,在方法根(method stub)處,勾選“public static void main(String [] args)”,然后單擊“完成”。
您的資源管理器看上去會與下圖類似:
步驟9:在當前項目上右擊,依次選擇“構建路徑”->“配置構建路徑”。
第10步:單擊“添加外部JAR”,然后定位到已下載保存的JAR文件。
步驟11:依次選擇Selenium Client文件夾中的兩個jar,以及l(fā)ibs文件夾里的jar文件。
步驟12:添加完畢后,您將在Libraries下看到所有的jar文件:
步驟13:依次點擊“應用”->“OK”。此時,您將在“包管理器”下看到所有的“引用庫”。
至此,我們已成功地在Eclipse Project中配置了Selenium WebDriver。
使用Selenium WebDriver執(zhí)行第一個測試腳本
我們將編寫一個簡單的測試程序,該程序將啟動Firefox瀏覽器,并打開“www.google.com”,在將瀏覽器最大化窗口后,最后退出會話。我們在代碼中將寫入前文在配置Selenium時創(chuàng)建的測試類。具體代碼段如下:
Java
- package firstPackage;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.firefox.FirefoxDriver;
- public class MyFirstTestClass {
- public static void main(String[] args) throws InterruptedException {
- System.setProperty("webdriver.gecko.driver","E:\\Softwares\\geckodriver.exe”);
- WebDriver driver = new FirefoxDriver();
- driver.get("https://www.google.com/");
- driver.manage().window().maximize();
- Thread.sleep(5000);
- driver.quit();
- }
- }
代碼說明:
- System.setProperty(“webdriver.gecko.driver”,”E:\\Softwares\\geckodriver.exe”)
這行代碼用于設置瀏覽器的屬性,即:將系統(tǒng)的屬性設置為給定值。WebDriver代碼將引用存儲在第二個參數(shù)中所在路徑里的驅動,并實例化Firefox驅動。注意,您需要提供的是存儲驅動程序的系統(tǒng)路徑。
- WebDriver driver = new FirefoxDriver()
我們通過引用WebDriver接口,來創(chuàng)建Firefox類的對象(Object)。也就是說,我們可以在Firefox實例中實現(xiàn)WebDriver的方法。
- driver.get(“https://www.google.com/”)
WebDriver的get()方法可以被用于打開URL,并等待頁面的完全加載。
- driver.manage().window().maximize()
maximum()方法可實現(xiàn)瀏覽器窗口的最大化。
- Thread.sleep(5000)
為了使實例在網(wǎng)絡連接速度過慢的情況下不會超時,我們可以通過休眠,使線程的執(zhí)行暫停指定的毫秒數(shù)(括號中的數(shù)值)。
- driver.quit()
quit()方法用于終止WebDriver會話,并關閉由WebDriver所啟動的瀏覽器窗口。
在執(zhí)行了上述代碼后,您將會在Eclipse Console窗口中看到如下執(zhí)行日志。而在執(zhí)行測試時,您也會觀察到瀏覽器窗口隨著Google的啟動,并在隨后自行關閉。
至此,您已經(jīng)成功地執(zhí)行了第一個Selenium WebDriver測試腳本。當然,您也可以試著使用其他瀏覽器驅動來編寫不同的測試腳本。
Selenium WebDriver的局限性
如前所述,Selenium WebDriver在取代RC方面有著諸多優(yōu)勢。不過客觀地說,它也存在著如下局限性:
i. Selenium WebDriver不支持基于Windows的應用程序自動化。
ii. Selenium WebDriver無法自動執(zhí)行圖像測試、提供驗證碼或OTP功能。
iii. Selenium WebDriver沒有任何內置的報告。
iv. 由于它是開源的,因此您必須依靠社區(qū)論壇,來解決各種技術問題。
v. 在使用Selenium WebDriver自動化之前,您需要至少具有一門編程語言的基礎知識。
vi. Selenium中沒有用于“測試管理”的測試集成工具。
vii. Selenium WebDriver不支持并行測試。這對于大型且復雜的測試套件而言,是一種嚴重的不足。
值得一提的是,如果你的確希望用Selenium來執(zhí)行并行測試的話,請試用Selenium的另一個組件--Selenium Grid。它通過從集線器服務器,向遠程Web瀏覽器實例發(fā)送命令,來實現(xiàn)并行測試。因此,在實際進行自動化測試時,我們可以用它來實現(xiàn)在多種瀏覽器、操作系統(tǒng)、以及設備上測試自動化腳本。
原標題:Most Practical Selenium WebDriver Tutorial With Examples ,作者:Ritesh Shetty
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】