從這一篇開始,開始正式的介紹Selenium 以及相關的組件,本文的將討論如下問題:
- Selenium基本的概念以及在企業化測試框架中的位置
- Selenium核心對象(瀏覽器驅動) Web Driver
- Selenium核心對象(Dom元素)Web Element
順便說明下,我所講到的是Selenium WebDriver的版本。
(一):Selenium基本概念
Selenium相關的概念的和資料在網上有很多。下面的這個是引用百度上面的介紹:
Selenium是一個用於Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite、Google Chrome等。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應用程序看是否能夠很好得工作在不同瀏覽器和操作系統之上。測試系統功能——創建回歸測試檢驗軟件功能和用戶需求。支持自動錄制動作和自動生成 .Net、Java、Perl等不同語言的測試腳本。
設置這一部分的內容不是為了說明Selenium是什么,畢竟類似的資源隨便一搜就有一大把。我更想分享給大家的是Selenium本身在企業級的測試框架中處於一個什么樣的位置。就拿我后續文章想要給大家展示的測試架構來說。Selenium所處的位置。如圖所示,Selenium不過是整個測試框架的一部分提供了針對B/S應用程序的測試驅動(即幫助我們提供了模擬在瀏覽器內部進行操作的功能),而整體的自動化平台的搭建還會結合其他的框架(如:單元測試框架<xUnit.Net>,針對Windows桌面應用的驅動,針對手機應用的驅動,提供數據訪問的能力... ...),對於如何構建完整的測試框架有機會我會開一個新的主題文章來討論,不懂也沒有關系,這里只是希望初學者在一開始就有一個系統的概念,知道自己所學的內容將來會用在哪里,該用在哪里。
(二):Selenium 核心對象 - 瀏覽器驅動(WebDriver)
正如之前講到的,Selenium主要的功能是協助我們來模擬人工操作瀏覽器。那么,我們應當如何來操作瀏覽器呢?答案就是WebDriver, Selenium 為我們提供了操作瀏覽器的統一接口以及針對各種主流瀏覽器驅動程序的實現:
如上圖所示,可以看到每一種WebDriver 都是對了各個瀏覽器廠商提供的驅動包的封裝,Selenium的優點在於為使用者提供了多種語言版本的Driver,這里我們只是描述C#版本的實現,其他版本也有類似的實現。說到這里,我們可以類比一下其他的測試驅動框架比如Appium,或是White,其實都是封裝了系統提供的自動化測試API,降低了上層的開發或者測試人員的學習成本和編程復雜度... ...
把上圖簡化一下,我們可以看到以下幾個對象:
- IWebDriver : Selenium 定義的WebDriver接口,具備常用的瀏覽器操作功能。
- ChromeDriver : 基於谷歌瀏覽器的驅動,使用時需要額外的驅動程序。
- FireFoxDriver : 基於Firefox瀏覽器的驅動。
- InternetExplorerDriver : 基於IE瀏覽器的驅動,使用時需要額外的驅動程序。
下面列出了Driver接口定的主要方法和屬性:
Methods:
- Close : 關閉當前窗口。
- FindElement : 查找Dom元素,返回單個的DOM元素。
- FindElements : 查找Dom元素,返回符合條件的DOM元素集合。
- Manage : 管理瀏覽器的設置信息。
- Navigate : 導航到某個地址。
- Quit : 關閉瀏覽器。
- SwitchTo : 用於切換Frame 和Window,處理彈出框等。
Properties:
- CurrentWindowHandle : 獲取當前窗口的操作句柄。
- PageSource : 獲取最后一次加載的頁面源代碼。
- Title : 獲取當前頁面的Title。
- Url : 獲取或設置當前瀏覽器的Url地址。
- WindowHandles : 獲取當前瀏覽器所有打開窗口的操作句柄。
(三):Selenium 核心對象 - DOM元素對象(WebElement)
同WebDriver一樣,Selenium提供的WebElement對象是用來描述頁面上的DOM對象(HTML的DOM對象用來描述頁面上的HTML元素),如頁面上的按鈕,多選框,輸入框,文本域,圖片... ... 都可以看作是一個WebElement對象,在后面的文章里,會對WebElement相關的操作和針對各個不同的DOM對象類型的處理做進一步的介紹,這一部分我們給大家展示一下WebElement常用的方法和屬性:
Methods:
- Clear : 清空當前DOM元素內容(用於文本輸入元素)。
- Click : 單擊當前DOM元素。
- FindElement : 查找當前DOM元素下的子元素,返回單個的DOM元素。
- FindElements : 查找當前DOM元素下的子元素,返回符合條件的DOM元素集合。
- GetAttribute: 獲取當前DOM元素的屬性值。
- GetCssValue : 獲取當前DOM元素CSS樣式。
- SendKey : 想當前DOM元素輸入指定文本。
- Submit : 提交當前元素到Web服務器。
Properties:
- Display: 獲取元素是否顯示。
- Enabled: 獲取元素是否可用。
- Location : 獲取元素位置信息。
- Seleced : 獲取元素是否選中。
- Size : 獲取元素的Height 和 Width。
- TagName : 獲取元素的TagName。
- Text : 獲取元素的文本內容。
(四):Selenium 核心對象 - By Class(定位條件)
關於By Class我會在下一篇《Lesson 03 - Selenium For C# 之 元素定位》中介紹。
(五):Demo
說了這么多,該到動手寫點什么的時候了。so... 我做了個簡單的Demo供大家有個感官的認識。下面的Code我已經上傳到Github地址是:https://github.com/DemoCnblogs/Selenium
這個Dome的主要有兩個目的,一方面對之前描述的部分概念做一個簡單的展示,另一方面主要展示了xUnit.Net Test Case的基本結構,代碼如下:
1 using OpenQA.Selenium; 2 using OpenQA.Selenium.Firefox; 3 using Xunit; 4 using Xunit.Abstractions; 5 6 namespace Demo.SeleniumTest 7 { 8 public class Lesson02_CoreObject 9 { 10 /// <summary> 11 /// 輸出對象 12 /// </summary> 13 private readonly ITestOutputHelper _output; 14 /// <summary> 15 /// 構造函數,初始化輸出對象 16 /// </summary> 17 /// <param name="output">注入輸出對象</param> 18 public Lesson02_CoreObject(ITestOutputHelper output) 19 { 20 this._output = output; 21 } 22 23 /// <summary> 24 /// demo1 : 獲取元素 25 /// </summary> 26 [Fact(DisplayName = "Cnblogs.CoreObject.Demo1")] 27 public void CoreObject_Demo1() 28 { 29 _output.WriteLine("Step 01 : 啟動瀏覽器並打開博客園首頁。"); 30 IWebDriver driver = new FirefoxDriver(); 31 driver.Url = "http://www.cnblogs.com"; 32 driver.Manage().Window.Maximize(); 33 34 _output.WriteLine("Step 02 : 獲取並輸出部分頁面信息。"); 35 _output.WriteLine(string.Format("Current window handle: {0}", driver.CurrentWindowHandle)); 36 _output.WriteLine(string.Format("Window handle count: {0}", driver.WindowHandles.Count)); 37 _output.WriteLine(string.Format("Current window title: {0}", driver.Title)); 38 39 _output.WriteLine("Step 03 : 驗證博客園站點的 Title 是否正確。"); 40 Assert.Equal<string>("博客園 - 開發者的網上家園", driver.Title); 41 42 _output.WriteLine("Step 04 : 關閉當前頁面。"); 43 driver.Close(); 44 } 45 } 46 }
這里我簡單的介紹一下Code的邏輯:
首先,構造函數注入了輸出的對象,這部分我會在xUnit.Net相關的文章作講解。性急的同學要是等不及我的更新也可以參照xUnit.Net的文檔:http://xunit.github.io。
然后,就是我們的Test case ,開啟本機的火狐瀏覽器>最大化並導航到博客園首頁>輸出信息>檢驗Title是否正確>關閉瀏覽器。
需要說明的是 輸出和驗證Title是xUnit.Net的功能(每個單元測試框架都有)。當然,生產環境使用的測試Code是會做更多的封裝的,這個代碼只是供大家學習使用。
最后,處理你會看見你本機的瀏覽器上面的操作之外,還會得到如下的輸出結果:
總結:本文主要介紹了以下幾點內容。
- Selenium的作用以及在企業級測試框架中的位置。
- 瀏覽器控制對象(驅動) WebDriver
- DOM元素對象WebElement
- 基本的Test Case 書寫
關於《Selenium For C#》 系列,我計划給大家逐一介紹一些Selenium Driver的基礎知識和框架的擴展點。 當然,之后會有更多關於測試框架構以及軟件構建方面的文章。願我主保佑我有時間做完這件事情... ...
《Selenium For C#》的相關文章:Click here.
- [小北De編程手記] : Lesson 01 - Selenium For C# 之 環境搭建
- [小北De編程手記] : Lesson 02 - Selenium For C# 之 核心對象
- [小北De編程手記] : Lesson 03 - Selenium For C# 之 元素定位
- [小北De編程手記] : Lesson 04 - Selenium For C# 之 API 上
- [小北De編程手記] : Lesson 05 - Selenium For C# 之 API 下
- [小北De編程手記] : Lesson 06 - Selenium For C# 之 流程控制
- [小北De編程手記] : Lesson 07 - Selenium For C# 之 窗口處理
- [小北De編程手記] : Lesson 08 - Selenium For C# 之 PageFactory & 團隊構建
說明:Demo地址:https://github.com/DemoCnblogs/Selenium