[Selenium With C#基礎(chǔ)教程] Lesson-02 Web元素定位

使用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í),通常使用FindElementFindElements方法結(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();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容