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

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

  • 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
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
posted @ 2016-01-28 23:11  小北@Alan  阅读(4974)  评论(2编辑  收藏  举报