使用Selenium來(lái)做自動(dòng)化測(cè)試,一般的流程是:

那么第一步我們需要能夠完成查找并定位元素,Selenium目前提供了8種基本定位方法,可根據(jù)實(shí)際情況進(jìn)行選擇,如下示:
| 定位方法 | 示例 |
|---|---|
| ID | FindElement(By.Id("user")) |
| Name | FindElement(By.Name("username")) |
| LinkText | FindElement(By.LinkText("Login")) |
| PartialLinkText | FindElement(By.PartialLinkText("Next")) |
| XPath | FindElement(By.Xpath("http://div[@id="login"]/input")) |
| TagName | FindElement(By.TagName("body")) |
| ClassName | FindElement(By.ClassName("table")) |
| CSS | FindElement(By.CssSelector("#login > input[type="text"]")) |
啟動(dòng)瀏覽器
Selenium支持的瀏覽器較多,我拿目前三大使用較多的瀏覽器(IE、Chrome、Firefox)做一個(gè)示例,來(lái)演示如何啟動(dòng)三大瀏覽器,代碼如下:
using System;
using System.Collections.ObjectModel;
//MS自帶的單元測(cè)試框架
using Microsoft.VisualStudio.TestTools.UnitTesting;
//Webdriver引用
using OpenQA.Selenium;
//IE引用
using OpenQA.Selenium.IE;
//Chrome引用
using OpenQA.Selenium.Chrome;
//Firefox引用
using OpenQA.Selenium.Firefox;
namespace SeleniumDemo
{
[TestClass]
//定義瀏覽器類型枚舉
public enum DriverType { IE, Chrome, Firefox };
public class Lesson02
{
//獲取瀏覽器驅(qū)動(dòng)程序路徑
string driverPath = AppDomain.CurrentDomain.BaseDirectory;
//定義使用瀏覽器類型
DriverType dt = DriverType.Chrome;
IWebDriver driver;
//獲取測(cè)試需要使用哪一種瀏覽器驅(qū)動(dòng)
public IWebDriver GetDirverType(DriverType driverType)
{
switch (driverType)
{
case DriverType.IE:
driver = new InternetExplorerDriver(driverPath);
break;
case DriverType.Chrome:
driver = new ChromeDriver();
break;
case DriverType.Firefox:
//3.0之后的Selenium Webdriver才需要這樣,2.0版本的可以直接以這種形式:driver = new FirefoxDriver();
FirefoxOptions fo = new FirefoxOptions();
//Firefox安裝路徑
fo.BrowserExecutableLocation = @"C:\Program Files\Mozilla Firefox\firefox.exe";
FirefoxDriverService fds = FirefoxDriverService.CreateDefaultService(driverPath);
driver = new FirefoxDriver(fds, fo, TimeSpan.FromSeconds(100));
break;
default:
break;
}
return driver;
}
[TestMethod]
public void Demo02()
{
driver = GetDirverType(dt);
//訪問(wèn)百度
driver.Navigate().GoToUrl("https://www.baidu.com");
//查找搜索輸入框,輸入Selenium
IWebElement searchText = driver.FindElement(By.Id("kw"));
//在輸入前清空內(nèi)容
searchText.Clear();
searchText.SendKeys("Selenium");
//查找元素
IWebElement searchBtn = driver.FindElement(By.Id("su"));
//點(diǎn)擊搜索按鈕
searchBtn.Click();
//退出瀏覽器
driver.Quit();
//driver.Close();
}
}
}
Close()與Quit()區(qū)別:
driver.Close():在完成操作后,僅關(guān)閉瀏覽器窗口,不會(huì)關(guān)閉Webdriver會(huì)話(我們?cè)跍y(cè)試每個(gè)用例時(shí),都會(huì)啟動(dòng)一個(gè)瀏覽器驅(qū)動(dòng)進(jìn)程,如果使用Close()方法,則瀏覽器驅(qū)動(dòng)進(jìn)程不會(huì)關(guān)閉,則使用Quit()則會(huì)自動(dòng)關(guān)閉)
driver.Quit():在完成操作后,同時(shí)關(guān)閉瀏覽器窗口和Weddriver會(huì)話
使用8種基本定位方法
在介紹基本的8種定位方法前,我們可以看看使用各瀏覽器自帶的Web開發(fā)工具或插件(Firebug/Firepath等)來(lái)查看如何進(jìn)行元素查看和定位:
使用IE自帶的Web開發(fā)工具(可使用F12快捷鍵進(jìn)行操作)如下所示:
在Firefox中使用Firebug+Firepath進(jìn)行定位元素,如下所示:
使用Chrome自帶Web開發(fā)工具進(jìn)行定位元素,如下所示:
在使用Selenium Webdriver進(jìn)行元素定位時(shí),通常使用FindElement或FindElements方法結(jié)合By類返回的元素句柄來(lái)定位元素。其中By類的常用定位方式共八種,現(xiàn)分別介紹如下:
By.Id()
通過(guò)元素的id屬性來(lái)定位元素,具有很強(qiáng)的唯一性,速度也較快。
Button: driver.FindElement(By.Id("submit_btn")).Click();
Link: driver.FindElement(By.Id("cancel_link")).Click();
Text: driver.FindElement(By.Id("username")).SendKeys("admin ") ;
HTML Div元素: driver.FindElement(By.Id("alert_div")).getText();
By.Name()
通過(guò)元素的name屬性來(lái)查找元素,在當(dāng)前頁(yè)面中可以不唯一,可能會(huì)存在同名的情況。
driver.FindElement(By.Name("comment")).SendKeys("comment ") ;
By.LinkText()
通過(guò)文本鏈接來(lái)查找元素,該鏈接必須能在頁(yè)面中為可見(jiàn)狀態(tài)。在一些頁(yè)面會(huì)出現(xiàn)在出現(xiàn)某個(gè)操作后,鏈接才能顯示出來(lái),如果沒(méi)有上一步操作,是無(wú)法直接使用該方法進(jìn)行定位元素的。
driver.FindElement(By.LinkText("新聞")).Click();
By. PartialLinkText()
PartialLinkText是對(duì)Link定位的一種補(bǔ)充,在文本鏈接比較長(zhǎng)或文本鏈接動(dòng)態(tài)生成的時(shí)候,可以使用該方法截取一部分文本進(jìn)行定準(zhǔn)。
driver.FindElement(By.PartialLinkText("新")).Click();
By. XPath()
XPath 是一門在 XML 文檔中查找信息的語(yǔ)言,可在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷。更多XPath信息可參考:http://www.w3school.com.cn/xpath/index.asp
driver.FindElement(By.XPath("http://input[@id='kw']"));
By.TagName()
該方法可通過(guò)元素的標(biāo)簽名稱來(lái)定位查找元素,通常該方法能定位到的元素會(huì)存在一個(gè)或多個(gè),建議結(jié)合FindElements()方法使用。
driver.FindElements(By.TagName("button"));
By. ClassName()
ClassName方法是通過(guò)元素的CSS樣式表所引用的偽類名稱來(lái)定位查找元素。通過(guò)情況下,一個(gè)元素會(huì)存在多個(gè)CSS樣式值,如下所示:
<a class="btn btn-default">百度一下</a>
<input type="submit" value="提交" class="btn btn-default btn-primary"/>
我們可以以下任何一種方法進(jìn)行定位元素:
driver.FindElement(By.ClassName("btn-primary ")).Click(); //提交按鈕
driver.FindElement(By.ClassName("btn ")).Click(); //百度一下鏈接
By.CssSelector()
在CSS中,選擇器是一種模式,用于選擇需要添加樣式的元素,更多資料可參考:http://www.w3school.com.cn/cssref/css_selectors.asp
driver.FindElement(By.CssSelector("#kw"));
多元素定位
通過(guò)FindElements可以一次返回多個(gè)匹配元素,使用方法與FindElement很像。示例如下:
ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.ClassName("mnav"));
本文中需要使用到的瀏覽器驅(qū)動(dòng)及插件可到百度網(wǎng)盤進(jìn)行下載:https://pan.baidu.com/s/1kV6uzzx 密碼:9m1q
本文完整代碼如下:
using System;
using System.Collections.ObjectModel;
//MS自帶的單元測(cè)試框架
using Microsoft.VisualStudio.TestTools.UnitTesting;
//Webdriver引用
using OpenQA.Selenium;
//IE引用
using OpenQA.Selenium.IE;
//Chrome引用
using OpenQA.Selenium.Chrome;
//Firefox引用
using OpenQA.Selenium.Firefox;
namespace SeleniumDemo
{
[TestClass]
//定義瀏覽器類型枚舉
public enum DriverType { IE, Chrome, Firefox };
public class Lesson02
{
//獲取瀏覽器驅(qū)動(dòng)程序路徑
string driverPath = AppDomain.CurrentDomain.BaseDirectory;
//定義使用瀏覽器類型
DriverType dt = DriverType.Chrome;
IWebDriver driver;
//獲取測(cè)試需要使用哪一種瀏覽器驅(qū)動(dòng)
public IWebDriver GetDirverType(DriverType driverType)
{
switch (driverType)
{
case DriverType.IE:
driver = new InternetExplorerDriver(driverPath);
break;
case DriverType.Chrome:
driver = new ChromeDriver();
break;
case DriverType.Firefox:
//3.0之后的Selenium Webdriver才需要這樣,2.0版本的可以直接以這種形式:driver = new FirefoxDriver();
FirefoxOptions fo = new FirefoxOptions();
//Firefox安裝路徑
fo.BrowserExecutableLocation = @"C:\Program Files\Mozilla Firefox\firefox.exe";
FirefoxDriverService fds = FirefoxDriverService.CreateDefaultService(driverPath);
driver = new FirefoxDriver(fds, fo, TimeSpan.FromSeconds(100));
break;
default:
break;
}
return driver;
}
[TestMethod]
public void Demo02()
{
driver = GetDirverType(dt);
//訪問(wèn)百度
driver.Navigate().GoToUrl("https://www.baidu.com");
//查找搜索輸入框,輸入Selenium
IWebElement searchText = driver.FindElement(By.Id("kw"));
//在輸入前清空內(nèi)容
searchText.Clear();
searchText.SendKeys("Selenium");
//查找元素
IWebElement searchBtn = driver.FindElement(By.Id("su"));
//點(diǎn)擊搜索按鈕
searchBtn.Click();
//退出瀏覽器
driver.Quit();
//driver.Close();
}
[TestMethod]
//一次定位多個(gè)元素
public void FindElementsDemo()
{
driver = GetDirverType(dt);
driver.Navigate().GoToUrl("https://www.baidu.com");
ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.ClassName("mnav"));
Console.WriteLine("查找到的元素個(gè)數(shù)為:{0}", elements.Count);
for (int i = 0; i < elements.Count; i++)
{
Console.WriteLine(elements[i].Text);
}
driver.Quit();
}
}
}


