[小北De編程手記] : Lesson 02 - Selenium For C# 之 核心對象

從這一篇開始,開始正式的介紹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

如果您認為這篇文章還不錯或者有所收獲,可以點擊右下角的【推薦】按鈕,因為你的支持是我繼續寫作,分享的最大動力!
作者:小北@North
來源:http://www.cnblogs.com/NorthAlan
聲明:本博客原創文字只代表本人工作中在某一時間內總結的觀點或結論,與本人所在單位沒有直接利益關系。非商業,未授權,貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

轉載于:https://www.cnblogs.com/NorthAlan/p/5156234.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272406.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java中HashMap的entrySet()你會用了嗎

Map中存放的元素均為鍵值對&#xff0c;故每一個鍵值對必然存在一個映射關系。 Map中采用Entry內部類來表示一個映射項&#xff0c;映射項包含Key和Value Map.Entry里面包含getKey()和getValue()方法 Set<Entry<T,V>> entrySet() 該方法返回值就是這個map中各個鍵…

JS獲取請求URL相關參數

今天在找獲取當前網址除去參數的js方式&#xff0c;結果自己會的竟然只有window.location.href 先看一個示例 用javascript獲取url網址信息 <script type"text/javascript"> document.write("location.host"location.host"<br>"); d…

wiki語法大全

Wiki語法大全 編輯一個維客頁面十分容易。只要點擊頁面上方的“編輯本頁”或右側的[編輯]鏈接即可修改該頁&#xff0c;或點擊“討論本頁”然后再點擊“編輯頁面”來討論該頁面。點擊后您就會看到一個包含那個Wiki頁面的可編輯的文字區域。 先將文字復制到您最喜歡的文字編輯器…

驅動認知

用戶態 App&#xff1a;cp指令&#xff0c;ftp的項目等等這就是App的開發。 App開發需要C的基礎和C庫&#xff0c;C庫講到文件&#xff0c;進程&#xff0c;進程間通信&#xff0c;線程&#xff0c;網絡&#xff0c;界面&#xff08;GTk&#xff09;。 C庫&#xff08;是linux標…

TreeMap實現排序

TreeMap TreeMap實現SortMap接口&#xff0c;能夠把它保存的記錄根據鍵排序&#xff0c;默認是按鍵值的升序排序&#xff0c;也可以指定排序的比較器。當用Iterator遍歷TreeMap時&#xff0c;得到的記錄是排過序的。 TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或…

圖解分布式架構的演進過程!

一、什么是分布式架構分布式系統&#xff08;distributed system&#xff09; 是建立在網絡之上的軟件系統。內聚性&#xff1a;是指每一個數據庫分布節點高度自治&#xff0c;有本地的數據庫管理系統。透明性&#xff1a;是指每一個數據庫分布節點對用戶的應用來說都是透明的&…

CSS 布局實例系列(四)如何實現容器中每一行的子容器數量隨著瀏覽器寬度的變化而變化?...

Hello&#xff0c;小朋友們&#xff0c;還記得我是誰嗎&#xff1f;對了&#xff0c;我就是~超威~好啦&#xff0c;言歸正傳&#xff0c;今天的布局實例是&#xff1a; 實現一個浮動布局&#xff0c;紅色容器中每一行的藍色容器數量隨著瀏覽器寬度的變化而變化&#xff0c;就如…

基于框架編寫驅動代碼

操作驅動的上層代碼&#xff08;pin4test&#xff09; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>void main() {int fd,data;fd open("/dev/pin4",O_RDWR);if(fd<0){printf("open fail…

nacos在windows下安裝

1:訪問https://github.com/alibaba/nacos/releases下載nacos 2:下載到本地解壓 3:點擊startup.cmd 啟動nacos 4:訪問 http://127.0.0.1:8848/nacos 輸入賬號和密碼&#xff0c;nacos/nacos

關于SQL優化這些你了解嗎?

背景在當今這個互聯網的時代無非要解決兩大難題&#xff0c;其一是信息安全&#xff0c;其二就是數據的存儲。而信息安全則是在數據存儲的基礎之上。一個公司從剛開始成立到發展成一個有上百人甚至上千人團隊的時候&#xff0c;公司的業務量是呈上升趨勢&#xff0c;客戶及用戶…

圖片安全保護(未啟動)

圖片安全保護&#xff08;未啟動&#xff09; 圖片安全保護&#xff08;未啟動&#xff09;posted on 2016-01-27 22:54 代碼35 閱讀(...) 評論(...) 編輯 收藏 轉載于:https://www.cnblogs.com/xinglizhenchu/p/5164847.html

微機總線地址,物理地址 ,虛擬地址

總線地址 地址總線 (Address Bus&#xff1b;又稱&#xff1a;位址總線) 屬于一種電腦總線 &#xff08;一部份&#xff09;&#xff0c;是由CPU 或有DMA 能力的單元&#xff0c;用來溝通這些單元想要存取&#xff08;讀取/寫入&#xff09;電腦內存元件/地方的實體位址。 自己…

Navicat遠程連接linux下mysql服務器1045錯誤解決辦法在這兒

1&#xff1a;首先通過xshell工具或者你熟悉的工具連接遠程linux下的服務器 mysql -uroot -p 然后輸入密碼 2.進行授權 如果想root用戶使用password從任何主機連接到mysql服務器的話。 GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 你的mysql密碼 WITH GRANT O…

內存劃分

一、內存分配 一個由C/C編譯的程序占用的內存分為以下幾個部分 1、棧區&#xff08;stack&#xff09;&#xff1a; 由編譯器自動分配釋放 &#xff0c;存放函數的參數值&#xff0c;局部變量的值等。其操作方式類似于數據結構中的棧。 2、堆區&#xff08;heap&a…

樹莓派 博通BCM2835芯片手冊

手冊提取鏈接 鏈接&#xff1a;https://pan.baidu.com/s/1fdmIBNn1Pr1j3-ercNhKJg 提取碼&#xff1a;8y1b 驅動的兩大利器&#xff1a; 1、電路圖:通過電路圖找到寄存器 2、芯片手冊 樹莓派有54個通用IO口(0到53)&#xff0c;所有GPIO口至少有兩個可選功能&#xff08;輸入輸…

MVC實現實現文件流打包成壓縮包

MVC實現實現文件流打包成壓縮包1、使用壓縮類庫SharpZipLib SharpZipLib 是一款比較經典實用C#壓縮類庫SharpZipLib 庫特點&#xff1a;功能豐富、穩定 &#xff0c;支持主流 zip、Gzip Tar BZip2 格式2、項目中引用SharpZipLib的官方地址是&#xff1a;http://icsharpcode.git…

Intellij idea 報錯:Error : java 不支持發行版本5

idea運行出現了這個錯誤 解決辦法按下圖所示&#xff1a;

屬性“dataProvider”有多個初始值設定項。(注意:“dataProvider”是“mx.charts.BarChart”的默認屬性)。...

1、錯誤描寫敘述 屬性“dataProvider”有多個初始值設定項。&#xff08;注意:“dataProvider”是“mx.charts.BarChart”的默認屬性&#xff09;。2、錯誤原因 <?xml version"1.0" encoding"utf-8"?> <s:Application xmlns:fx"http://ns.…

IO口操控代碼

我們在編寫驅動程序的時候&#xff0c;IO空間的起始地址是0x3f000000,加上GPIO的偏移量0x2000000,所以GPIO的物理地址應該是從0x3f200000開始的&#xff0c;然后在這個基礎上進行Linux系統的MMU內存虛擬化管理&#xff0c;映射到虛擬地址上。 底層驅動代碼 #include <linu…

C#一些實用的函數

1.DateTime 轉為Unix的long的時間戳long orderTime order.AddTime.ToUnixTimeStamp("Milliseconds");long payTime order.StartTime.Value.ToUnixTimeStamp("Milliseconds");2、獲取客戶端IP/// <summary>/// 獲取調用方的IP地址/// </summary&…