自己動手寫Web自動化測試框架(2):開啟和操縱IE

Just4life發表於2013-07-31
這一個部分我們來講用SHDocVw對IE進行操作。

  接下來的幾篇文章我們都會以Console Application來向大家介紹Web自動化的一些基礎。

  以下的程式碼在VS2005上通過測試,相信在VS2005 express已經VS2008上也可以通過,不過在VS2003上可能要稍微修改。使用vs2003的朋友,建議大家使用VS2005 express。

  瀏覽器使用了IE7。 IE6以及更低版本並沒有做過試驗。

  首先我們開啟VS2005,建立一個Console Application專案:

  新建一個命令列工程

  接下來我們需要包含兩個引用了,就是mshtml和SHDocVw。關於這兩個dll的簡單介紹,請參見:自己動手寫Web自動化測試框架(1) :概述

  包含mshtml引用

  第二個SHDocVw一定要在下面這個路徑找:(Windows/system32/shdocvw.dll)

 

包含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秒鐘,大家可以根據自己機器的狀況進行修改。

  這裡為了讓大家可以更好的理解,我插一點Process的講解,如果大家對上面的Process開啟沒有任何問題的話,直接跳過往下就好了。這裡Process.Start()方法其實有4個過載,我們使用了第三個過載函式,也就是第一個輸入檔名,第二個輸入引數,我們可以在執行命令列中打"iexplore about:blank"直接開啟一個空的IE視窗,也可以打"iexplorehttp://www.colblog.net/"直接開啟一個瀏覽到目標網站的IE視窗。

  IE啟動了,我們接下來的事情就是把IE附加給SHDocVw.InternetExlporer以便我們可以進行接下來的操作。

 

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

{
  SHDocVw.ShellWindowsallBrowser =newShellWindows();
  if(allBrowser.Count != 0)
  {
    for(inti = 0; i < allBrowser.Count; i++)
    {
      InternetExplorere = (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視窗,並且連結到我的部落格上

  下面附上原始碼,不過需要登入才可以拿到,各位多多包含

  下一次我們來了解得到網頁中的各個Element。

 

相關文章