[Selenium With C#基础教程] Lesson-02 Web元素定位

作者:Surpassme

来源:http://www.jianshu.com/p/cfd4ed1daabd

声明:本文为原创文章,如需转载请在文章页面明显位置给出原文链接,谢谢。

   

使用Selenium来做自动化测试,一般的流程是:查找定位元素--->操作元素--->断言,那么第一步我们需要能够完成查找并定位元素,Selenium目前提供了8种基本定位方法,可根据实际情况进行选择,如下示:

定位方法

示例

ID

FindElement(By.Id("user"))

Name

FindElement(By.Name("username"))

LinkText

FindElement(By.LinkText("Login"))

PartialLinkText

FindElement(By.PartialLinkText("Next"))

XPath

FindElement(By.Xpath("//div[@id="login"]/input"))

TagName

FindElement(By.TagName("body"))

ClassName

FindElement(By.ClassName("table"))

CSS

FindElement(By.CssSelector("#login   > input[type="text"]"))

Step-1:启动浏览器

  Selenium支持的浏览器较多,我拿目前三大使用较多的浏览器(IE、Chrome、Firefox)做一个示例,来演示如何启动三大浏览器,代码如下:

  1 using System;
  2 
  3 using System.Collections.ObjectModel;
  4 
  5 //MS自带的单元测试框架
  6 
  7 using Microsoft.VisualStudio.TestTools.UnitTesting;
  8 
  9 //Webdriver引用
 10 
 11 using OpenQA.Selenium;
 12 
 13 //IE引用
 14 
 15 using OpenQA.Selenium.IE;
 16 
 17 //Chrome引用
 18 
 19 using OpenQA.Selenium.Chrome;
 20 
 21 //Firefox引用
 22 
 23 using OpenQA.Selenium.Firefox;
 24 
 25  
 26 
 27 namespace SeleniumDemo
 28 
 29 {
 30 
 31     [TestClass]
 32 
 33     public class Lesson02
 34 
 35     {
 36 
 37         //获取浏览器驱动程序路径
 38 
 39         string driverPath = AppDomain.CurrentDomain.BaseDirectory;
 40 
 41         //定义浏览器类型枚举
 42 
 43         public enum DriverType { IE, Chrome, Firefox };
 44 
 45         //定义使用浏览器类型
 46 
 47         DriverType dt = DriverType.Chrome;
 48 
 49         IWebDriver driver;
 50 
 51         //获取测试需要使用哪一种浏览器驱动
 52 
 53         public IWebDriver GetDirverType(DriverType driverType)
 54 
 55         {
 56 
 57             switch (driverType)
 58 
 59             {
 60 
 61                 case DriverType.IE:
 62 
 63                     driver = new InternetExplorerDriver(driverPath);
 64 
 65                     break;
 66 
 67                 case DriverType.Chrome:
 68 
 69                     driver = new ChromeDriver();
 70 
 71                     break;
 72 
 73                 case DriverType.Firefox:
 74 
 75                     //3.0之后的Selenium Webdriver才需要这样,2.0版本的可以直接以这种形式:driver = new FirefoxDriver();
 76 
 77                     FirefoxOptions fo = new FirefoxOptions();
 78 
 79                     //Firefox安装路径
 80 
 81                     fo.BrowserExecutableLocation = @"C:\Program Files\Mozilla Firefox\firefox.exe";
 82 
 83                     FirefoxDriverService fds = FirefoxDriverService.CreateDefaultService(driverPath);
 84 
 85                     driver = new FirefoxDriver(fds, fo, TimeSpan.FromSeconds(100));
 86 
 87                     break;
 88 
 89                 default:
 90 
 91                     break;
 92 
 93             }
 94 
 95             return driver;
 96 
 97         }
 98 
 99  
100 
101         [TestMethod]
102 
103         public void Demo02()
104 
105         {
106 
107             driver = GetDirverType(dt);
108 
109             //访问百度
110 
111             driver.Navigate().GoToUrl("https://www.baidu.com");
112 
113             //查找搜索输入框,输入Selenium
114 
115             IWebElement searchText = driver.FindElement(By.Id("kw")); 
119             //在输入前清空内容
120 
121             searchText.Clear();
122 
123             searchText.SendKeys("Selenium");
124 
125             //查找元素
126 
127             IWebElement searchBtn = driver.FindElement(By.Id("su"));
128 
129             //点击搜索按钮
130 
131             searchBtn.Click();
132 
133             //退出浏览器
134 
135             driver.Quit();
136 
137             //driver.Close();
138 
139         }
140 
141     }
142 
143 }

 

Close()与Quit()区别:

driver.Close():在完成操作后,仅关闭浏览器窗口,不会关闭Webdriver会话(我们在测试每个用例时,都会启动一个浏览器驱动进程,如果使用Close()方法,则浏览器驱动进程不会关闭,则使用Quit()则会自动关闭)

driver.Quit():在完成操作后,同时关闭浏览器窗口和Weddriver会话

 

Step-2:使用8种基本定位方法

在介绍基本的8种定位方法前,我们可以看看使用各浏览器自带的Web开发工具或插件(Firebug/Firepath等)来查看如何进行元素查看和定位:

使用IE自带的Web开发工具(可使用F12快捷键进行操作)如下所示:

                       

在Firefox中使用Firebug+Firepath进行定位元素,如下所示:

 

使用Chrome自带Web开发工具进行定位元素,如下所示:

 

在使用Selenium Webdriver进行元素定位时,通常使用FindElement或FindElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种,现分别介绍如下:

  • By.Id()

通过元素的id属性来定位元素,具有很强的唯一性,速度也较快。

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()

通过元素的name属性来查找元素,在当前页面中可以不唯一,可能会存在同名的情况。

driver.FindElement(By.Name("comment")).SendKeys("comment ") ;

  • By.LinkText()

通过文本链接来查找元素,该链接必须能在页面中为可见状态。在一些页面会出现在出现某个操作后,链接才能显示出来,如果没有上一步操作,是无法直接使用该方法进行定位元素的。

driver.FindElement(By.LinkText("新闻")).Click();

  • By. PartialLinkText ()

PartialLinkText是对Link定位的一种补充,在文本链接比较长或文本链接动态生成的时候,可以使用该方法截取一部分文本进行定准。

driver.FindElement(By.PartialLinkText("新")).Click();;

  • By. XPath ()

XPath 是一门在 XML 文档中查找信息的语言,可在 XML 文档中对元素和属性进行遍历。更多XPath信息可参考:http://www.w3school.com.cn/xpath/index.asp

driver.FindElement(By.XPath("//input[@id='kw']"));

  • By.TagName()

该方法可通过元素的标签名称来定位查找元素,通常该方法能定位到的元素会存在一个或多个,建议结合FindElements()方法使用。

driver.FindElements(By.TagName("button"));

  • By. ClassName ()

ClassName方法是通过元素的CSS样式表所引用的伪类名称来定位查找元素。通过情况下,一个元素会存在多个CSS样式值,如下所示:

<a href="https://www.baidu.com" class="btn btn-default">百度一下</a>

<input type="submit" value="提交" class="btn btn-default btn-primary"/>

 

我们可以以下任何一种方法进行定位元素:

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"));

  • 多元素定位

通过FindElements可以一次返回多个匹配元素,使用方法与FindElement很像。示例如下:

ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.ClassName("mnav"));

本文中需要使用到的浏览器驱动及插件可到百度网盘进行下载: https://pan.baidu.com/s/1kV6uzzx 密码:9m1q

本文完整代码如下:

 1 using System;
 2 using System.Collections.ObjectModel;
 3 //MS自带的单元测试框架
 4 using Microsoft.VisualStudio.TestTools.UnitTesting;
 5 //Webdriver引用
 6 using OpenQA.Selenium;
 7 //IE引用
 8 using OpenQA.Selenium.IE;
 9 //Chrome引用
10 using OpenQA.Selenium.Chrome;
11 //Firefox引用
12 using OpenQA.Selenium.Firefox;
13 
14 namespace SeleniumDemo
15 {
16     [TestClass]
17     public class Lesson02
18     {
19         //获取浏览器驱动程序路径
20         string driverPath = AppDomain.CurrentDomain.BaseDirectory;
21         //定义浏览器类型枚举
22         public enum DriverType { IE, Chrome, Firefox };
23         //定义使用浏览器类型
24         DriverType dt = DriverType.Chrome;
25         IWebDriver driver;
26         //获取测试需要使用哪一种浏览器驱动
27         public IWebDriver GetDirverType(DriverType driverType)
28         {
29             switch (driverType)
30             {
31                 case DriverType.IE:
32                     driver = new InternetExplorerDriver(driverPath);
33                     break;
34                 case DriverType.Chrome:
35                     driver = new ChromeDriver();
36                     break;
37                 case DriverType.Firefox:
38                     //3.0之后的Selenium Webdriver才需要这样,2.0版本的可以直接以这种形式:driver = new FirefoxDriver();
39                     FirefoxOptions fo = new FirefoxOptions();
40                     //Firefox安装路径
41                     fo.BrowserExecutableLocation = @"C:\Program Files\Mozilla Firefox\firefox.exe";
42                     FirefoxDriverService fds = FirefoxDriverService.CreateDefaultService(driverPath);
43                     driver = new FirefoxDriver(fds, fo, TimeSpan.FromSeconds(100));
44                     break;
45                 default:
46                     break;
47             }
48             return driver;
49         }
50 
51         [TestMethod]
52         public void Demo02()
53         {
54             driver = GetDirverType(dt);
55             //访问百度
56             driver.Navigate().GoToUrl("https://www.baidu.com");
57             //查找搜索输入框,输入Selenium
58             IWebElement searchText = driver.FindElement(By.Id("kw"));
60
//在输入前清空内容 61 searchText.Clear(); 62 searchText.SendKeys("Selenium"); 63 //查找元素 64 IWebElement searchBtn = driver.FindElement(By.Id("su")); 65 //点击搜索按钮 66 searchBtn.Click(); 67 //退出浏览器 68 driver.Quit(); 69 //driver.Close(); 70 } 71 72 [TestMethod] 73 //一次定位多个元素 74 public void FindElementsDemo() 75 { 76 driver = GetDirverType(dt); 77 driver.Navigate().GoToUrl("https://www.baidu.com"); 78 ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.ClassName("mnav")); 79 Console.WriteLine("查找到的元素个数为:{0}", elements.Count); 80 for (int i = 0; i < elements.Count; i++) 81 { 82 Console.WriteLine(elements[i].Text); 83 } 84 driver.Quit(); 85 } 86 } 87 }

 

posted @ 2017-02-24 16:06  Surpassme  阅读(858)  评论(0编辑  收藏  举报