本身动手写Web自动化测试框架(3):操纵Web控件

上面的两次课程咱们介绍了mshtml和SHDocVw的一些用途,以及如何打开而且附加到IE上,实现IE的宏观上的控制。php

  此次咱们将会用代码找到咱们想要的控件,而后对控件进行一些操做。html

  首先咱们引入一个很好的IE控件:Internet Explorer Developer Toolbar,这个控件能够帮助咱们方便的找到咱们想要的控件的属性。框架

  安装好这个控件以后,咱们就能够方便的找到每个控件的ID,或者其余属性了,以下图测试

  IE Developer.net

  注意,打开IE Developer Toolbar以后,要点选下面的鼠标按钮,才能够用鼠标来选择咱们想要的控件。有了这个控件,咱们就不用去查看源文件来找到咱们想要的信息了。其余的功能这里很少说了。htm

  接下来咱们以百度的三个控件为例,分别告诉你们如何使用ID获得TextBox,如何点击使用ID获得的Button,如何使用子控件缩小范围的方法获得一个HyperLink。对象

  首先咱们修改上次的代码,把IE指到百度去:blog

 

Console.WriteLine("Navigating ...");get

object o = null;
ie.Navigate("baidu.com", ref o, ref o, ref o, ref o);
Thread.Sleep(2000);it

 

  代码咱们在本身动手写Web自动化测试框架(2):打开和操纵IE都讲解过了。只有一点,咱们在完成IE的跳转以后,等待了2秒钟的时间,缘由是IE的工做是须要时间的,咱们在后面的测试框架部分会讲解如何判断IE已经完成了页面的跳转,在这里为了让你们更好的了解咱们本节的主题,只是用了简单的等待。

  而后咱们用IE Developer Tools获得了关键字文本框的ID是kw,因此咱们用下面的代码在关键字文本框里面输入了咱们想要的关键字:

 

//获得一个Text Box
Console.WriteLine("Inputing Keyword ...");
HTMLDocument doc = (HTMLDocument)ie.Document;
HTMLInputElement keyword = (HTMLInputElement)doc.getElementById("kw");
keyword.value = "colblog.net";
Thread.Sleep(1000);

 

首先咱们用ie.Document对象获得了HTMLDocument。目的没什么可说的,由于咱们须要HTMLDocument获得下面的控件。而这里之因此使用强制类型转换,是由于Document对象在这里返回一个object的引用,但实际上是一个HTMLDocument的实例。因此转换一下就行了,在mshtml里面,这种状况还很多,在msdn上有详细的讲解,使用的时候查一下就行了。

  而后使用HTMLDocument.getElementById方法,直接从Document里面按照ID取出想要的控件,返回一个 IHTMLElement,IHTMLElement是HTMLElement的抽象,全部的HTML的tag均可以是一个IHTMLElement,返回这样的一个引用,咱们在知道将会返回什么类型的状况下,可使用强制类型转换来把对象转成咱们想要的引用。就像上面咱们所作的,返回的实际上是一个 Input tag,因此咱们要把他转换成HTMLInputElement就行了。

  下面一句咱们直接对这个对象的value进行设置,就能够完成在关键词文本框里面输入咱们想要的关键词的动做。

  接下来咱们要点击搜索按钮:

 

//获得一个按钮

Console.WriteLine("Clicking Submit ...");
HTMLInputElement submit = (HTMLInputElement)doc.getElementById("sb");
submit.click();
Thread.Sleep(2000);

 

  有了上面文本框的解释,这一段代码就容易多了吧。这里不在赘述。

  聪明的读者必定会问:咱们如今使用ID查询控件,若是咱们的控件没有ID怎么办?若是ID是重复的怎么办?

  上面的两种状况都是彻底可能的,并且在实际中几乎占据了大部分的状况。(不过ASP.NET里面的控件却是都有ID,使用这种方法比较方便。)咱们下面的例子就是去点击百度首页右上角的登陆超级连接。

  首先咱们分析一下,登陆超级连接是放在一个id为u的div里面,而登陆超级连接是没有ID的。咱们的思路就是先找到这个id为u的div,而后找他的chidren找到咱们想要的这个超级连接,下面是源代码:

 

//获得一个连接

Console.WriteLine("Clicking Login Button ...");
IHTMLElement userPanel = doc.getElementById("u");
IHTMLElementCollection HyperLinks = ((IHTMLElement2)userPanel).getElementsByTagName("a");
IHTMLElement login = (IHTMLElement)HyperLinks.item(null, 0);

login.click();

 

  首先咱们获得了那个id为u的div,命名为userPanel。这一步和上面没啥区别。

  下面一个语句咱们获得了userPanel的控件的全部tag为a的控件,也就是全部的超级连接。这里有一个小小的须要注意的地方,咱们看到这个语句吧IHTMLElement对象强制类型转换成了IHTMLElement2,颇有意思,为啥会这样呢?其实IHTMLElement有4个这样的兄弟,他们之间的方法不一样,能够互相转换,咱们想要的getElementsByTagName在IHTMLElement2下面,因此咱们就强制类型转换到IHTMLElement2。这个方法返回一个IHTMLCollection。咱们用HyperLinks来储存这个引用。

  由于userPanel的子控件只有登陆超级连接这一个,因此咱们直接使用index为0来取道这个对象就行了。IHTMLElementCollection里面的item方法详见msdn,咱们只须要把第二个index设置为0,就能够取到第一个子对象。

相关文章
相关标签/搜索