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

如果您认为这篇文章还不错或者有所收获,可以点击右下角的【推荐】按钮,因为你的支持是我继续写作,分享的最大动力!
作者:小北@North
来源:http://www.cnblogs.com/NorthAlan
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

转载于:https://www.cnblogs.com/NorthAlan/p/5156234.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中HashMap的entrySet()你会用了吗

Map中存放的元素均为键值对&#xff0c;故每一个键值对必然存在一个映射关系。 Map中采用Entry内部类来表示一个映射项&#xff0c;映射项包含Key和Value Map.Entry里面包含getKey()和getValue()方法 Set<Entry<T,V>> entrySet() 该方法返回值就是这个map中各个键…

JS获取请求URL相关参数

今天在找获取当前网址除去参数的js方式&#xff0c;结果自己会的竟然只有window.location.href 先看一个示例 用javascript获取url网址信息 <script type"text/javascript"> document.write("location.host"location.host"<br>"); d…

wiki语法大全

Wiki语法大全 编辑一个维客页面十分容易。只要点击页面上方的“编辑本页”或右侧的[编辑]链接即可修改该页&#xff0c;或点击“讨论本页”然后再点击“编辑页面”来讨论该页面。点击后您就会看到一个包含那个Wiki页面的可编辑的文字区域。 先将文字复制到您最喜欢的文字编辑器…

驱动认知

用户态 App&#xff1a;cp指令&#xff0c;ftp的项目等等这就是App的开发。 App开发需要C的基础和C库&#xff0c;C库讲到文件&#xff0c;进程&#xff0c;进程间通信&#xff0c;线程&#xff0c;网络&#xff0c;界面&#xff08;GTk&#xff09;。 C库&#xff08;是linux标…

TreeMap实现排序

TreeMap TreeMap实现SortMap接口&#xff0c;能够把它保存的记录根据键排序&#xff0c;默认是按键值的升序排序&#xff0c;也可以指定排序的比较器。当用Iterator遍历TreeMap时&#xff0c;得到的记录是排过序的。 TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或…

图解分布式架构的演进过程!

一、什么是分布式架构分布式系统&#xff08;distributed system&#xff09; 是建立在网络之上的软件系统。内聚性&#xff1a;是指每一个数据库分布节点高度自治&#xff0c;有本地的数据库管理系统。透明性&#xff1a;是指每一个数据库分布节点对用户的应用来说都是透明的&…

CSS 布局实例系列(四)如何实现容器中每一行的子容器数量随着浏览器宽度的变化而变化?...

Hello&#xff0c;小朋友们&#xff0c;还记得我是谁吗&#xff1f;对了&#xff0c;我就是~超威~好啦&#xff0c;言归正传&#xff0c;今天的布局实例是&#xff1a; 实现一个浮动布局&#xff0c;红色容器中每一行的蓝色容器数量随着浏览器宽度的变化而变化&#xff0c;就如…

基于框架编写驱动代码

操作驱动的上层代码&#xff08;pin4test&#xff09; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>void main() {int fd,data;fd open("/dev/pin4",O_RDWR);if(fd<0){printf("open fail…

nacos在windows下安装

1:访问https://github.com/alibaba/nacos/releases下载nacos 2:下载到本地解压 3:点击startup.cmd 启动nacos 4:访问 http://127.0.0.1:8848/nacos 输入账号和密码&#xff0c;nacos/nacos

关于SQL优化这些你了解吗?

背景在当今这个互联网的时代无非要解决两大难题&#xff0c;其一是信息安全&#xff0c;其二就是数据的存储。而信息安全则是在数据存储的基础之上。一个公司从刚开始成立到发展成一个有上百人甚至上千人团队的时候&#xff0c;公司的业务量是呈上升趋势&#xff0c;客户及用户…

图片安全保护(未启动)

图片安全保护&#xff08;未启动&#xff09; 图片安全保护&#xff08;未启动&#xff09;posted on 2016-01-27 22:54 代码35 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/xinglizhenchu/p/5164847.html

微机总线地址,物理地址 ,虚拟地址

总线地址 地址总线 (Address Bus&#xff1b;又称&#xff1a;位址总线) 属于一种电脑总线 &#xff08;一部份&#xff09;&#xff0c;是由CPU 或有DMA 能力的单元&#xff0c;用来沟通这些单元想要存取&#xff08;读取/写入&#xff09;电脑内存元件/地方的实体位址。 自己…

Navicat远程连接linux下mysql服务器1045错误解决办法在这儿

1&#xff1a;首先通过xshell工具或者你熟悉的工具连接远程linux下的服务器 mysql -uroot -p 然后输入密码 2.进行授权 如果想root用户使用password从任何主机连接到mysql服务器的话。 GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 你的mysql密码 WITH GRANT O…

内存划分

一、内存分配 一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区&#xff08;stack&#xff09;&#xff1a; 由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区&#xff08;heap&a…

树莓派 博通BCM2835芯片手册

手册提取链接 链接&#xff1a;https://pan.baidu.com/s/1fdmIBNn1Pr1j3-ercNhKJg 提取码&#xff1a;8y1b 驱动的两大利器&#xff1a; 1、电路图:通过电路图找到寄存器 2、芯片手册 树莓派有54个通用IO口(0到53)&#xff0c;所有GPIO口至少有两个可选功能&#xff08;输入输…

MVC实现实现文件流打包成压缩包

MVC实现实现文件流打包成压缩包1、使用压缩类库SharpZipLib SharpZipLib 是一款比较经典实用C#压缩类库SharpZipLib 库特点&#xff1a;功能丰富、稳定 &#xff0c;支持主流 zip、Gzip Tar BZip2 格式2、项目中引用SharpZipLib的官方地址是&#xff1a;http://icsharpcode.git…

Intellij idea 报错:Error : java 不支持发行版本5

idea运行出现了这个错误 解决办法按下图所示&#xff1a;

属性“dataProvider”有多个初始值设定项。(注意:“dataProvider”是“mx.charts.BarChart”的默认属性)。...

1、错误描写叙述 属性“dataProvider”有多个初始值设定项。&#xff08;注意:“dataProvider”是“mx.charts.BarChart”的默认属性&#xff09;。2、错误原因 <?xml version"1.0" encoding"utf-8"?> <s:Application xmlns:fx"http://ns.…

IO口操控代码

我们在编写驱动程序的时候&#xff0c;IO空间的起始地址是0x3f000000,加上GPIO的偏移量0x2000000,所以GPIO的物理地址应该是从0x3f200000开始的&#xff0c;然后在这个基础上进行Linux系统的MMU内存虚拟化管理&#xff0c;映射到虚拟地址上。 底层驱动代码 #include <linu…

C#一些实用的函数

1.DateTime 转为Unix的long的时间戳long orderTime order.AddTime.ToUnixTimeStamp("Milliseconds");long payTime order.StartTime.Value.ToUnixTimeStamp("Milliseconds");2、获取客户端IP/// <summary>/// 获取调用方的IP地址/// </summary&…