从这一篇开始,开始正式的介绍Selenium 以及相关的组件,本文的将讨论如下问题:
顺便说明下,我所讲到的是Selenium WebDriver的版本。
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的优点在于为使用者提供了多种语言版本的Driver,这里我们只是描述C#版本的实现,其他版本也有类似的实现。说到这里,我们可以类比一下其他的测试驱动框架比如Appium,或是White,其实都是封装了系统提供的自动化测试API,降低了上层的开发或者测试人员的学习成本和编程复杂度... ...
把上图简化一下,我们可以看到以下几个对象:
下面列出了Driver接口定的主要方法和属性:
同WebDriver一样,Selenium提供的WebElement对象是用来描述页面上的DOM对象(HTML的DOM对象用来描述页面上的HTML元素),如页面上的按钮,多选框,输入框,文本域,图片... ... 都可以看作是一个WebElement对象,在后面的文章里,会对WebElement相关的操作和针对各个不同的DOM对象类型的处理做进一步的介绍,这一部分我们给大家展示一下WebElement常用的方法和属性:
关于By Class我会在下一篇《Lesson 03 - Selenium For C# 之 元素定位》中介绍。
说了这么多,该到动手写点什么的时候了。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 For C#》 系列,我计划给大家逐一介绍一些Selenium Driver的基础知识和框架的扩展点。 当然,之后会有更多关于测试框架构以及软件构建方面的文章。愿我主保佑我有时间做完这件事情... ...
《Selenium For C#》的相关文章:Click here.
说明:没有超链接的文章写完发表后,我会添加相应的链接,在此先列出目录。