March 23, 2014

使用Selenium WebDriver進行網頁自動化測試

幾年前剛加入某個團隊時,因為對當時團隊所開發的系統還不熟悉,所以先被指派協助做UAT,順便了解一下系統中的主要功能,該系統是以ASP.NET Web Forms所開發。一開始還傻傻地照著測試案例文件做測試,在幾天之後開始覺得每次要手動做重覆的事情,雖然可以藉此了解一下系統功能,但似乎有點不太科學,也有點浪費時間,心想這種事應該是要自動化處理吧?

當時腦海先是閃過利用Sikuli來幫我開網頁點按鈕輸入資料做這些苦工,卻意外發現了Selenium IDE,讓我眼睛為之一亮。在接下來的幾天我就改用Selenium IDE錄製好測試案例,輕鬆地完成自動化UAT。然而Selenium IDE只支援FireFox,當時開發的系統主要還是以IE為主,所以又開始尋找可以以IE進行網頁自動化測試的方式。當時使用了WatiN,也成功地寫了些測試程式。

以上是題外話,目前的團隊相當重視測試,團隊成員不僅需要撰寫單元/整合測試,也需要知道如何撰寫Selenium測試,以便讓build server進行自動化測試,也因此發現原來Selenium也已經提供WebDriver機制讓.NET開發人員可以在VS裡針對不同的瀏覽器撰寫相同的測試程式。以下介紹如何使用Selenium WebDriver來進行網頁自動化測試,所使用的瀏覽器為Chrome。

首先建立兩個demo用的專案,一個為ASP.NET MVC 5專案SeleniumDemo,另一個為Class Library專案SeleniumDemo.Tests,並加入了Microsoft.VisualStudio.QualityTools.UnitTestFramework參考


在SeleniumDemo.Tests專案中透過NuGet指令Install-Package Selenium.WebDriver加入Selenium WebDriver參考。


http://chromedriver.storage.googleapis.com/index.html下載Chrome DriverChrome Driver為Selenium WebDriver啟動Chrome會使用到的執行檔(chromedriver.exe),並存放在tools資料夾裡。


確認ASP.NET MVC 5專案預設的網站可以正常執行後,我們要模擬使用者點選Register連結,看看使用者是否有被導向註冊頁面。

using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace SeleniumDemo.Tests
{
    [TestClass]
    public class AccountTests
    {
        [TestMethod]
        public void Can_Display_Register_Page()
        {
            string chromeDriverDirectory = string.Format(@"{0}\..\..\..\tools", Directory.GetCurrentDirectory());

            IWebDriver driver = new ChromeDriver(chromeDriverDirectory);
            driver.Navigate().GoToUrl("http://localhost:64872/");

            IWebElement registerLink = driver.FindElement(By.Id("registerLink"));

            registerLink.Click();

            Assert.AreEqual("http://localhost:64872/Account/Register", driver.Url);

            driver.Quit();
        }
    }
}

在以上程式碼中,我們設定了Chrome Driver(chromedriver.exe)的實體位置給WebDriver後,便透過WebDriver開啟瀏覽器導向網站首頁,找出Register連結並點選它,最後驗證導向後的網址是否為註冊頁面的網址,成功地話瀏覽器就會被關閉。這個測試案例很簡單,雖然有個小問題,例如測試失敗的話,瀏覽器就不會被關閉。但做為demo,我想這樣已經足夠。完整的範例專案可由https://github.com/petekcchen/blog/tree/master/SeleniumDemo下載。

No comments: