[小北De编程手记] : Lesson 04 - Selenium For C# 之 API 上

  这一部分,我准备向大家介绍Selenium WebDriver的常用API,学习这部分内容需要大家最好有一些简单的HTML相关知识,本文主要涉及到以下内容:

  • Selenium API:元素检查
  • Selenium API:事件处理
  • Selenium API:其他操作
  • Selenium API:框架扩展

  回顾一下我之前讲过的一个概念:所谓自动化测试,可以简单的归结为是一个从被测试程序中识别或是定位元素以及执行操作验证元素的过程。从框架设计的角度来讲,一个自动化测试框架的驱动程序应该向使用者提供“元素定位,执行操作和元素验证”的功能。关于Selenium提供的优秀的“元素定位”能力,上一篇文章《Lesson 03 - Selenium For C# 之 元素定位》我已经做了相关的描述。而这一篇博客,会介绍Selenium如何模拟用户执行操作以及如何获取需要验证的元素。

(一)Selenium API:元素检查

  谈到基于B/S的自动化测试,我们需要检查的主要对象是网页的DOM元素,而Selenium为我们提供了很多标准的API来获取我们想要的内容:

  • 获取元素的文本
  • 获取元素的属性
  • 获取元素的CSS样式

@.获取元素文本信息

  说到这里我先简单的介绍一下这三部分内容和DOM元素的关系(照顾一下完全不懂HTML的同学)。所谓元素的文本,可以简单的认为是手工测试过程中页面上可见的文本信息(即显示内容),如一个输入框内的文本,一个只读的文本域或是一个网页的Title... .... 这些都指的是元素的文本。IWebElement定义了获取元素文本的方式(只读的Text属性):

 1     public interface IWebElement : ISearchContext
 2     {
 3         //省略其他属性方法... ...
 4         //
 5         // Summary:
 6         //     Gets the innerText of this element, without any leading or trailing whitespace,
 7         //     and with other whitespace collapsed.
 8         //
 9         // Exceptions:
10         //   OpenQA.Selenium.StaleElementReferenceException:
11         //     Thrown when the target element is no longer valid in the document DOM.
12         string Text { get; }
13     }

下面这段代码就是获取了博客园首页导航的文本并输出,测试输出如图所示:

 1         /// <summary>
 2         /// demo1 : 检查首页文本
 3         /// </summary>
 4         [Fact(DisplayName = "Cnblogs.SeleniumAPI.Demo1")]
 5         public void SeleniumAPI_Demo1()
 6         {
 7             _output.WriteLine("Step 01 : 启动浏览器并打开博客园首页。");
 8             IWebDriver driver = new FirefoxDriver();
 9             driver.Url = "http://www.cnblogs.com";
10
11             _output.WriteLine("Step 02 : 寻找需要检查的页面元素。");
12             var lnkHome = driver.FindElement(By.XPath(".//ul[@class=‘post_nav_block‘]/li[1]/a"));
13
14             _output.WriteLine(string.Format("导航内栏内容:{0}", lnkHome.Text));
15
16             _output.WriteLine("Step 04 : 关闭浏览器。");
17             driver.Close();
18         }

@.获取元素属性

  开发人员可以通过配置各种元素的属性来控制DOM元素的行为或者样式。这里需要说明一下,什么是DOM元素的属性。还是以博客园首页为例,用Firebug查看导航中“首页”对应的元素:

一般的DOM元素格式如下:

<tag_name attribute1="value1" attribute2="value2"... ...>Text Content</tag_name>

  这里tag_name是a,而class,href分别是该元素对应的属性。我们可以用IWebElement定义的GetAttribute方法来获取属性对应的值。从而获取对DOM做相关的验证和判断,可以用以下代码获取获取这个元素的class属性:

1     _output.WriteLine("Step 02 : 寻找需要检查的页面元素。");
2        var lnkHome = driver.FindElement(By.XPath(".//ul[@class=‘post_nav_block‘]/li[1]/a"));
3        var value = lnkHome.GetAttribute("class");

@.获取元素CSS样式

  简单的说DOM元素的TagName和属性描述了DOM元素的类型(即这个元素是什么,文本框,按钮还是下拉菜单),而元素的展现样式则是由CSS(层叠样式表)决定的。在此我默认读者是一个懂一些CSS知识的同学,毕竟我们的主题是Selenium。CSS定义了元素的样式,比如宽度,高度,颜色等等... ... ,我们可以用IWebElement定义的GetCssValue方法获取元素的样式,比如我们需要验证某个元素的显示字体,颜色,或是显示与否等信息。都可以通个这个方法来获取。同样我们可以获取并输出博客园是首页文本的字体和颜色:

 1         /// <summary>
 2         /// demo2 : 检查首页文本的属性,字体和颜色
 3         /// </summary>
 4         [Fact(DisplayName = "Cnblogs.SeleniumAPI.Demo2")]
 5         public void SeleniumAPI_Demo2()
 6         {
 7             _output.WriteLine("Step 01 : 启动浏览器并打开博客园首页。");
 8             IWebDriver driver = new FirefoxDriver();
 9             driver.Url = "http://www.cnblogs.com";
10
11             _output.WriteLine("Step 02 : 寻找需要检查的页面元素。");
12             var lnkHome = driver.FindElement(By.XPath(".//ul[@class=‘post_nav_block‘]/li[1]/a"));
13
14             lnkHome.GetCssValue("color");
15
16             _output.WriteLine(string.Format("导航内栏内容:{0}", lnkHome.Text));
17             _output.WriteLine(string.Format("classs属性内容:{0}", lnkHome.GetAttribute("class")));
18             _output.WriteLine(string.Format("字体:{0}", lnkHome.GetCssValue("font-family")));
19             _output.WriteLine(string.Format("颜色:{0}", lnkHome.GetCssValue("color")));
20
21
22             _output.WriteLine("Step 04 : 关闭浏览器。");
23             driver.Close();
24         }

输出结果:

(二)Selenium API:事件处理

  Selenium的事件处理大可分为两个部分:简单事件处理和复合操作。

  • 简单事件:指的是类似单击某个按钮,输入文本等等。
  • 复合事件:指的是执行一组事件链(比如:按住Ctrl的同时单击鼠标)

@.简单事件处理

  这部分内容我在之前的文章中提到过《Lesson 02 - Selenium For C# 之 核心对象》,IWebElement定义了一常见的事件处理函数:

  • Clear : 清空当前DOM元素内容(用于文本输入元素)。
  • Click : 单击当前DOM元素。
  • SendKey : 向当前DOM元素输入指定文本。
  • Submit : 提交当前元素到Web服务器。

  下面的例子实现了如下功能:(导航到博客园首页>在搜索框中输入“小北De编程手记”>点击“找找看”并等待五秒>关闭浏览器)

 1         /// <summary>
 2         /// demo3 : 首页查询
 3         /// </summary>
 4         [Fact(DisplayName = "Cnblogs.SeleniumAPI.Demo3")]
 5         public void SeleniumAPI_Demo3()
 6         {
 7             _output.WriteLine("Step 01 : 启动浏览器并打开博客园首页。");
 8             IWebDriver driver = new FirefoxDriver();
 9             driver.Url = "http://www.cnblogs.com";
10
11             _output.WriteLine("Step 02 : 寻找需要操作的页面元素。");
12             var txtSearch = driver.FindElement(By.Id("zzk_q"));
13             var btnSearch = driver.FindElement(By.XPath(".//input[@type=‘button‘ and @value=‘找找看‘]"));
14
15             _output.WriteLine("Step 03 : 输入查询文本");
16             txtSearch.SendKeys("小北De编程手记");
17
18             _output.WriteLine("Step 04 : 点击查询");
19             btnSearch.Click();
20
21             System.Threading.Thread.Sleep(5000);
22
23             _output.WriteLine("Step 05 : 关闭浏览器。");
24             driver.Close();
25         }

  运行这个Demo,正如代码所述的一步步操作... ...

  篇幅所限,今天先写到这里(其实是困了~~~ 哈哈哈)。下一篇我会讲解Selenium实现复杂交互操作,元素的拖拽,特殊DOM元素的处理(下拉菜单,单选复选框)

《Selenium For C#》的相关文章:Click here.

说明:

  没有超链接的文章写完发表后,我会添加相应的链接,在此先列出目录。

  Demo地址:https://github.com/DemoCnblogs/Selenium

如果您认为这篇文章还不错或者有所收获,可以点击右下角的【推荐】按钮,因为你的支持是我继续写作,分享的最大动力!

作者:小北@North

来源:http://www.cnblogs.com/NorthAlan

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

时间: 01-27

[小北De编程手记] : Lesson 04 - Selenium For C# 之 API 上的相关文章

[小北De编程手记] : Lesson 05 - Selenium For C# 之 API 下

上一篇,我们介绍了一些Selenium WebDriver相关的API,下面我们就接着上一篇继续介绍Selenium常用的API,这一篇的内容主要涉及到以下话题: Selenium API:复杂事件处理 Selenium API:特殊DOM元素处理 Selenium API:截图功能 Selenium API:关于框架扩展 (一)Selenium API:复杂事件处理 首先,我们试想一下这样的场景.待测试的系统支持一些组合键的操作,例如:按住Ctrl的同时点击某个表格的某个单元格,该数据行会高亮

[小北De编程手记] : Lesson 08 - Selenium For C# 之 PageFactory &amp; 团队构建

本文想跟大家分享的是Selenium对PageObject模式的支持和自动化测试团队的构建.<Selenium For C#>系列的文章写到这里已经接近尾声了,如果之前的文章你是一篇篇的读下来并动手实践的话,我相信你应该可以模拟日常工作中80%常见的手动测试用例了.请注意:我的用词是模拟用例,而不是书写自动化测试用例.一个企业级的自动化测试的构建不是单靠Selenium一种技术就能Hold住的.所谓模拟指的是只能实现自动化的某个Case,但是不能工程化的使用.在本人所接触过几家公司的自动化测试

[小北De编程手记] : Lesson 06 - Selenium For C# 之 流程控制

无论你是用哪一种自动化测试的驱动框架,当我们构建一个复杂应用程序的自动化测试的时候.都希望构建一个测试流程稳定,维护成本较低的自动化测试.但是,现实往往没有理想丰满.而这一篇,我会为大家讲解我们在使用Selenium进行Web测试的时候应该如何控制我们的测试流程,从而尽可能地提高自动化测试可维护性.那么,先看一下这一篇的内容主要涉及到的话题: 自动化测试的成本 隐式的等待同步策略 显式的等待同步策略 自定义等待同步策略(一些关于自动化框架设计的探讨) (一)自动化测试的成本 <Selenium

[小北De编程手记] : Lesson 07 - Selenium For C# 之 窗口处理

在实际的自动化测试过程中,我们会遇见许多需要对窗口进行处理的情况.比如,点击删除某条信息的时候系统会显示一个Alert框.或者点击某个超链接时会在浏览器中打开一个新的页面.这一篇,来和大家分享一下Selenium WebDriver窗口处理相关的API.那么,还是照例先看一下本文主要涉及到的话题: 窗口处理接口:ITargetLocator 浏览器弹出窗口的处理(新页面) JavaScript弹出框的处理:Alert, Confirm, Prompt 内嵌框架的处理:Frame , iFrame

[小北De编程手记] : Lesson 04 玩转 xUnit.Net 之 Fixture(下)

上一篇文章<[小北De编程手记] : Lesson 03 玩转 xUnit.Net 之 Fixture(上)>向大家介绍了xUnit.Net 共享数据的方式.Test Case的构造函数 & IDisposable.Dispose.Class级别的Fixture : IClassFixture.这一篇,我们接着讲解后面的内容,回顾一下本文要讨论的内容: xUnit.Net 共享数据的方式(上) Test Case的构造函数 & IDisposable.Dispose(上) Cl

[小北De编程手记] : Lesson 03 - Selenium For C# 之 元素定位

无论哪一种自动化测试的驱动框架(基于B/S,桌面应用,还是手机App).都应当具有一套优秀的元素定位技术.通常的自动化测试流程也可以简单的归结为是一个从被测试程序中识别或是定位元素以及执行操作和验证元素的过程.这一篇我们就开始给大家介绍一下Selenium中是如何定位DOM元素的.本文将会介绍如下内容: Selenium DOM 主要的定位方式. Selenium 如何扩展元素定位方式. 辅助浏览器工具 (一)Selenium DOM主要定位方式 上一篇中,我们介绍了WebDriver 和 We

[小北De编程手记] : Lesson 01 - Selenium For C# 之 环境搭建

在我看来一个自动化测试平台的构建,是一种很好的了解开发语言,单元测试框架,自动化测试驱动,设计模式等等等的途径.因此,在下选择了自动化测试的这个话题来和大家分享一下本人关于软件开发和自动化测试的认识.刚刚开通了博客,就从最基础的开始吧,算是写给初学者的编程手记,也算是给对自动化完全不了解的小伙伴开个头.时间允许的话会坚持更新下去... ... 后续的文章计划会谈到一些企业级自动化测试平台的构建(但愿有时间完成哈~~). 关于自动化测试的框架,网上有很多相关的对比,在这里我我就不评论和对比了.本人

[小北De编程手记] : Lesson 03 玩转 xUnit.Net 之 Fixture(上)

在使用xUnit.Net Framework构建单元测试或自动化测试项目的时候,无论是针对一些比较耗费资源的对象亦或是为了支持Test case预设数据的能力,我们都需要有一些初始化或是清理相关的动作.在xUnit.Net中,提供了多种方式来满足我们的需要.还是照例看一下本文要讨论的内容: xUnit.Net 共享数据的方式(上) Test Case的构造函数 & IDisposable.Dispose(上) Class级别的Fixture : IClassFixture(上) 应用程序级别的F

[小北De编程手记] Lesson 01 - AutoFramework构建 之 从一个简单的Demo聊起

写在最前面 这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得.这几年,做了一些自动化测试框架以及团队的构建的工作.过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的类库或者工具之后,打算进一步的提高.我想这个系列也许会帮助到你,我们一起从各个维度来看一看自动化测试框架的一些最佳实践.本人能力有限,如果有什么不正确的的地方还各位大牛指正. 聊聊自动化测试的初心 在开始具体的技术和理论之前,我们先来思考一下自动化测试的目的是什么?我简单的罗列了几点: 替代手工测试