您的位置:首页 > 编程语言 > C#

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

2017-02-24 16:06 543 查看

作者: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 }

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: