【生生不息原创】自己动手写Web自动化测试框架2 - 打开和操纵IE

这一个部分我们来讲用SHDocVw对IE进行操作。

接下来的几篇文章我们都会以Console Application来向大家介绍Web自动化的一些基础。

 NoticeNotice

以下的代码在VS2005上通过测试,相信在VS2005 express已经VS2008上也可以通过,不过在VS2003上可能要稍微修改。使用vs2003的朋友,建议大家使用VS2005 express

浏览器使用了IE7。 IE6以及更低版本并没有做过试验。

首先我们打开VS2005,建立一个Console Application项目:

 新建一个命令行工程新建一个命令行工程

接下来我们需要包含两个引用了,就是mshtml和SHDocVw。关于这两个dll的简单介绍,请参见:自己动手写Web自动化测试框架1 - 概述

 包含mshtml引用包含mshtml引用

第二个SHDocVw一定要在下面这个路径找:(C:\Program Files\Microsoft Visual Studio 8\Application\PreEmptive Solutions\Dotfuscator Community Edition)

 包含SHDocVw包含SHDocVw

包含两个类库之后,我们就可以使用C#来对IE进行一些基本的操作了。

我们要添加几个命名空间,来简化我们下面的代码:

using System.Diagnostics;   //要用到进程来启动IE窗口
using System.Threading;     //使用Thread.Sleep来等待
using SHDocVw;
using mshtml;

除了mshtml和SHDocVw之外,我们还使用了其他的两个命名空间,因为我们要使用System.Diagnostics.Process类启动IE进程,并且获取IE的进程信息,使用System.Threading.Thread的sleep()方法等待。

接下来,我们就可以写入代码了:

Console.WriteLine("Launching IE ...");
Process p = Process.Start("iexplore.exe","about:blank");
Thread.Sleep(3000);

第一步,我们要打开IE进程,这里使用了Process的Start静态方法生成一个进程。很好理解,传入了两个参数,一个是IE的exe文件名,也可以写入完整地址;第二个参数是IE自己的参数,表示要打开的链接地址,我们在这里使用一个空白页面。
接下来的事情就是等待,等待IE进程启动,这里为了让大家更快的抓到本质,没有使用很复杂的等待代码,只是很机械的等待了3秒钟,大家可以根据自己机器的状况进行修改。

 NoticeNotice  这里为了让大家可以更好的理解,我插一点Process的讲解,如果大家对上面的Process打开没有任何问题的话,直接跳过往下就好了。这里Process.Start()方法其实有4个重载,我们使用了第三个重载函数,也就是第一个输入文件名,第二个输入参数,我们可以在运行命令行中打"iexplore about:blank"直接打开一个空的IE窗口,也可以打"iexplore http://www.colblog.net/"直接打开一个浏览到目标网站的IE窗口。

IE启动了,我们接下来的事情就是把IE附加给SHDocVw.InternetExlporer以便我们可以进行接下来的操作。

Console.WriteLine("Attaching to IE ...");
InternetExplorer ie = null;
if (p != null)

{
  SHDocVw.ShellWindows allBrowser = new ShellWindows();
  if (allBrowser.Count != 0)
  {
    for (int i = 0; i < allBrowser.Count; i++)
    {
      InternetExplorer e = (InternetExplorer)allBrowser.Item(i);
      if (e.HWND == (int)p.MainWindowHandle)
      {
        ie = e;
        break;
      }
    }
  }
}
else
{
  Console.WriteLine("Error: Can not Launch IE");
  return;
}
if (ie == null)
{
  Console.WriteLine("Error: Can not attach to IE");
  return;
}

首先,我们先声明了一个InternetExplorer的引用,这里设为空引用。他以后会存储我们的IE实例,并且通过它,我们可以操纵IE进行一些操作。
然后我们判断刚刚启动的进程p是不是为空,如果为空,就报错,说明不能启动IE(Can not Launch IE)。如果不为空,就可以进行下面的操作了。
注意,这里我们用了比较特殊的方法来得到InternetExplorer实例,就是通过比较当前Windows中已经存在的进程编号,来找到刚刚启动的IE实例,用allBrowser来获取所有的Shell Windows,然后逐个和刚刚启动的进程p的Handle号进行比较,如果相同,就说明是我们想要的进程,把他的InternetExplorer实例赋给我们ie。
最后我们判断一下ie引用是否有了实例,因为刚刚的循环我们无法保证一定有实例被赋给ie,这里如果检查失败,就报错返回。

通过上面的几步,我们已经启动并且拿到了InternetExplorer的实例,我们可以对这个实例进行一些操作了。举个最简单的例子就是浏览到某一个网页,下面的代码让这个浏览器指向了我的博客地址:


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

object o = null;

ie.Navigate("www.colblog.net", ref o, ref o, ref o, ref o);

这里都很简单,只有一个让人费解的地方就是object o。因为ie.Navigate需要5个参数,后面的4个是可选参数,所以我们只需要象征性的传入一个null就可以了,有一个同事问我为啥不直接传null,还要申请一个object,其实原因就在于参数是ref的,必须有一个引用被传进去才行。关于后面的四个参数的讲解请看msdn上的讲解

运行一下就发现,程序顺利的打开一个IE窗口,并且链接到我的博客上Cool

下面附上源代码,不过需要登录才可以拿到,各位多多包含。Smile

下一次我们来了解得到网页中的各个Element。

为什么我在vs2005中编译上面代码,提示Error:'SHDocVw.ShellBrowserWindow' does not contain a definition for 'Count'
与Error:'SHDocVw.ShellBrowserWindow' does not contain a definition for 'Item'

hi,thanks!

 

有两个问题向您请教
1. 我们的程序是通过 windows 验证的方式来判断用户的,如果我要用不同的用户进行测试,需要在浏览器加载时输入用户名和密码(VISTA)或者使用RunAs的方式(XP).这样的话,可以实现吗?

2. 页面代码写的不规范,比如一个dropdown list控件,他是用table模仿出来的,需要出发修改JavaScript中的一个值。这样的话可以实现吗?

上面可能说的不是很清楚,如果你可以帮忙的话,邮件或msn联系。(邮箱即是MSN帐号)

十分感谢!

 

感谢您的评论:
第一个问题:
在打开一个IEProcess的时候,可以设置这个Process的StartInfo,这个时候加入您的域用户帐户密码就好了。
第二个问题:
没听懂。。。

您现在是匿名用户,我看不到您的邮箱或者msn,请注册登陆后和我联系。
可以直接点击circleoflife发信给我。

谢谢

 

benz的程序已经开始暂露头角了。就目前的知识我们应该可以做一个小的病毒程序了。

 

很好,很强大。我看好你吆。。。

 

不错不错,benz出的书是彩页的

 

感谢大家的支持!我一定会努力的做,坚持的做,把这个部分完成。
感谢Liang的指正。呵呵。

 

Ben, 希望你继续写下去,坚持做完,非常好。

不过一点小问题就是关于ShDocVw.dll, 这个实际上是一个COM,在C:\Windows\System32\ShDocVw.dll,你可以直接在你的Project里引用,在COM那个Tab里,找到Microsoft Internet Control, 就是这个东西。引用以VS IDE会自动帮你生成COM Interop proxy 的dll.

 

先坐上再说~~舒坦~~哈哈

 

恩 像那么回事了!! 加油~~~

建议把代码也共享上来

 

感谢您关注我的个人博客!
为了您的更好的阅读和留言,建议您注册用户,这样您可以获得更大的权限,以及更方便的留言。
注册只需要一分钟的时间。但是您需要提供您的邮箱。注册后,密码会自动发到您的邮箱,请在第一次登录时修改。
我承诺不会将您的Email泄露给他人,或者发送垃圾邮件。

用户登录

我的微博

feedsky
抓虾
google reader
my yahoo
newsgator
bloglines
鲜果
哪吒
有道
QQ邮箱
九点
帮看