[小北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