Selenium是一個很好用的Web自動化測試工具。Aaron很久以前使用過Selenium,不過僅僅用了其提供的API來寫測試程式碼,也在blog上發過一個簡單的程式碼示例。近來有好幾個博友加我MSN問我有關Selenium錄製的問題,可惜以前沒有使用過,愛莫能助。鑑於此,昨天晚上磨嘰了一陣子終於讓指令碼給跑起來了。Aaron希望對於那些博友及其他人會有幫助。
Selenium IDE簡介和安裝
Selenium錄製功能是由Selenium IDE實現的。根據官方網站當前的介紹:
Selenium IDE is a Firefox add-on that records clicks, typing, and other actions to make a test, which you can play back in the browser.
上面已經寫的很清楚了,Selenium IDE可以幫助我們記錄下點選,輸入等行為並可以支援在瀏覽器中回放。
當然還有一點想必讀者已經看出來了,Selenium IDE是一個Firefox外掛,所以Selenium當前的版本(2009-1-18)是不支援IE的錄製的,當然這對於指令碼的使用影響並不是很大——除非你是想錄制之後直接使用,那你就會失望了,selenium當前的版本並沒有達到那種強悍的程度。
Selenium IDE的安裝很簡單,如果使用Firefox 2.0,可以直接將官網上下載的檔案(例如selenium-ide-1.0-beta-2.xpi)置於Firefox安裝路徑下的extensions資料夾(預設安裝路徑C:\Program Files\Mozilla Firefox\extensions,而Firefox1.5的預設路徑在C:\Program Files\Firefox Plus\App\firefox\extensions)下,然後關閉當前開啟的Firefox視窗,重新開啟即可執行自動安裝。Aaron在使用過程中並未出現過安裝失敗的情況。
如果你使用的是Firefox 3.0,恭喜你中獎了:你會失敗,原因也很簡單,selenium IDE目前支援的最高版本還沒有達到我們3.0的高度。(更正:感謝一樓提醒,Aaron已驗證1.0 beta 2版本的Selenium IDE可以在Firefox3中安裝成功,給大家造成的誤導Aaron表示誠摯的歉意)
另外,需要提醒的是:使用最新版本的Selenium IDE錄製可能會導致錄製失敗(selenium-ide-1.0-beta-1.xpi,selenium-ide-1.0-beta-2.xpi版本在Aaron使用過程中均會出現錯誤,提示:table view is not available in this format),這個bug已經被人提交到Selenium論壇上面去了,提交者使用的是Win XP,而Aaron使用的是Win 2003,因此為了避免大家浪費時間——儘管只是一種可能性的浪費,Aaron推薦暫時使用我試驗中使用的0.8.7版本。
宣告:因為隨著版本的變化,本文中的部分內容與最新版本的使用可能會不一致,因此Aaron介紹的內容適用於於2009-1-18之前的selenium版本:
Project |
Release Date |
Version |
Selenium Core |
Jan 12, 2009 |
1.0 beta 2 |
Selenium IDE |
June 3 |
2008 1.0 beta 2 |
Selenium RC |
Jan 12, 2009 |
1.0 beta 2 |
Selenium Grid |
Nov 30, 2008 |
1.0.3 |
Selenium IDE指令碼錄製
好了,安裝完成了,接下來我們就直接使用IDE來錄製吧。啟動Firefox瀏覽器,在Firefox選單欄中單擊“工具”選單,我們會看到Selenium IDE是其子選單:
單擊Selenium IDE項我們可以看到彈出Selenium IDE視窗:
然後我們就可以使用Selenium IDE進行錄製了。至於錄製的詳細過程我就不詳細介紹了,不過還是提醒大家一下,我們可以使用Selenium IDE的選單欄“Options”選單中的“Format”子選單將指令碼轉化為各自所需的語言型別。
Aaron在文章接下來的部分使用C#作為示例語言。
編輯Selenium IDE指令碼
Aaron錄製的指令碼工作流程是:開啟Firefox瀏覽器->開啟Google首頁->在google搜尋框中輸入“google”->左鍵單擊“google 搜尋”按鈕->在新頁面選中“圖片、新聞搜尋”以驗證:
最後得到的C#指令碼如下:
using System; using System.Text; using System.Text.RegularExpressions; using System.Threading; using NUnit.Framework; using Selenium; namespace SeleniumTests { [TestFixture] public class NewTest { private ISelenium selenium; private StringBuilder verificationErrors; [SetUp] public void SetupTest() { selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com"); selenium.Start(); verificationErrors = new StringBuilder(); } [TearDown] public void TeardownTest() { try { selenium.Stop(); } catch (Exception) { // Ignore errors if unable to close the browser } Assert.AreEqual("", verificationErrors.ToString()); } [Test] public void TheNewTest() { selenium.Open("http://www.google.cn/"); Assert.AreEqual("Google", selenium.GetTitle()); selenium.Type("q", "google"); selenium.Click("btnG"); selenium.WaitForPageToLoad("30000"); Assert.AreEqual("google - Google 搜尋", selenium.GetTitle()); try { Assert.IsTrue(selenium.IsTextPresent("圖片、新聞搜尋")); } catch (AssertionException e) { verificationErrors.Append(e.Message); } } } } |
一般情況下,這些錄製的指令碼在Selenium IDE中會重新執行成功,但如果我們將指令碼直接拿出來在我們自己的IDE下會怎麼樣呢?
為了更方便編輯我們錄製的指令碼,將這段程式碼拷貝到VS中:新建一個類庫專案TestSeleniumSimple,並將類庫專案下的class1.cs檔案中的內容用錄製的指令碼覆蓋。編譯我們的類庫專案TestSeleniumSimple,很遺憾我們看到了
不用驚訝,因為我們仔細看一看程式碼就知道了,原來錄製的指令碼中引用了一些內容:
using NUnit.Framework;
using Selenium;
對於第一個我們需要安裝NunitFramework,這個可以到Nunit官網上下載,如果你同時下載了Selenium-RC,你可以在\Selenium-RC\selenium-remote-control-1.0-beta-2-dist\selenium-remote-control-1.0-beta-2\selenium-dotnet-client-driver-1.0-beta-2資料夾下找到它,同時也可以找到我們“using Selenium”所需要的ThoughtWorks.Selenium.Core.dll,新增對這兩個dll的引用,然後再編譯。這個時候就可以生成成功了。
在測試框架中回放指令碼
好事總是多磨,我們編譯成功的指令碼很可惜,不能執行。在編譯完指令碼後出現Nunit不能使用的問題,不知道是偶然還是有必然因素。還好Aaron的指令碼是在虛擬機器中錄製的,所以Aaron將編譯成功的指令碼直接拿到了物理機上執行。開啟Nunit(Aaron使用的是NUnit-2.4.3-net-2.0版本),然後匯入TestSeleniumSimple.dll(TestSeleniumSimple類庫的產品),點選執行,又出錯了:
原來是伺服器,還記得我們剛才引用了Selenium-RC中的兩個DLL嗎?Selenium RC中RC是Remote Client的意思,既然有Client那麼一定是有Server了,實際上還真有這樣一個Selenium-server,一個用來啟動web瀏覽器的傢伙。我們找到Selenium-RC的目錄下的Server子目錄A:
\Selenium-RC\selenium-remote-control-1.0-beta-2-dist\selenium-remote-control-1.0-beta-2\selenium-server-1.0-beta-2
裡面由一個selenium-server.jar檔案,我們需要在命令列下啟動這個server。
在命令列下定位到子目錄A處,接著輸入:
Java –jar selenium-server.jar
這個時候我們可以看到我們順利啟動了Selenium Server了,試著執行一下剛才失敗的測試指令碼,終於綠了:
我們還可以注意到命令列工具中也有執行的資訊:
比如我們在上圖的倒數第四條資訊中看到了:
13:04:57.406 INFO - Command request: isTextPresent[圖片、新聞搜尋, ] on session
f68a3d7d0d7b4de8bfdb95ae1c553e6b
等很詳細的內容。
總結
其實我們也可以不使用NUnit,而直接使用VSTS中Test Edition元件來執行我們的測試指令碼,為了使指令碼更穩定或者執行更快,我們也可以編輯指令碼對時間做一些處理。我們也可以編輯指令碼已增加更多的斷言以確保待測頁面顯示了我們想要的內容或者沒有顯示我們不想要的內容等等。
對於Selenium IDE錄製指令碼,Aaron稍微總結一下:
1, 使用Firefox
2, 編譯之前新增對於NUnit.Framework.dll和ThoughtWorks.Selenium.Core.dll的引用
3, 記得啟動Selenium Server
4, 為提高指令碼質量以滿足測試穩定性等需求,應該對錄製的指令碼進行編輯
當然,在使用Selenium的過程中,我們還會碰到其他各種奇怪的問題而導致指令碼出現問題。限於篇幅和時間問題,Aaron就不繼續討論了。另外,我們也可以寫一些程式來幫助我們更好的使用Selenium(比如自動啟動selenium-server,自動執行指令碼等等),這些內容Aaron也留給大家自己去實踐~