上面的兩次課程咱們介紹了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; |
代碼咱們在本身動手寫Web自動化測試框架(2):打開和操縱IE都講解過了。只有一點,咱們在完成IE的跳轉以後,等待了2秒鐘的時間,緣由是IE的工做是須要時間的,咱們在後面的測試框架部分會講解如何判斷IE已經完成了頁面的跳轉,在這裏爲了讓你們更好的瞭解咱們本節的主題,只是用了簡單的等待。
而後咱們用IE Developer Tools獲得了關鍵字文本框的ID是kw,因此咱們用下面的代碼在關鍵字文本框裏面輸入了咱們想要的關鍵字:
//獲得一個Text Box |
首先咱們用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 ..."); |
有了上面文本框的解釋,這一段代碼就容易多了吧。這裏不在贅述。
聰明的讀者必定會問:咱們如今使用ID查詢控件,若是咱們的控件沒有ID怎麼辦?若是ID是重複的怎麼辦?
上面的兩種狀況都是徹底可能的,並且在實際中幾乎佔據了大部分的狀況。(不過ASP.NET裏面的控件卻是都有ID,使用這種方法比較方便。)咱們下面的例子就是去點擊百度首頁右上角的登陸超級連接。
首先咱們分析一下,登陸超級連接是放在一個id爲u的div裏面,而登陸超級連接是沒有ID的。咱們的思路就是先找到這個id爲u的div,而後找他的chidren找到咱們想要的這個超級連接,下面是源代碼:
//獲得一個連接 Console.WriteLine("Clicking Login Button ..."); 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,就能夠取到第一個子對象。