PowerShell2.0之與COM對象交互(四)IE自動化

上一篇文章主要介紹了powershell中通過COM操作Excel,本篇文章中將會着重介紹powershell中通過COM操作IE達到自動化管理的目的。

Internet Explorer瀏覽器提供基於COM的富對象模型,可以用來編寫網站的自動化測試腳本模仿用戶操作,如輸入文字和單擊按鈕等並用瀏覽器創建提交信息的腳本。

能夠編程控制Internet Explorer的仍然是application對象,其ProgID是InternetExplorer.Application。完成自動化範例腳本需要的操作步驟如下。

(1)創建Internet Explorer Application對象。

(2)瀏覽一個URL。

(3)等待瀏覽器載入文檔內容。

(4)操作文檔。

(5)通過調用Quit()方法退出Application。

如果Internet Explorer在後臺瀏覽並下載網頁內容,則意味着腳本將不會被阻塞,當嘗試操作未曾下載完畢的文檔時將會崩潰。可以使用sleep cmdlet來阻塞腳本的執行並週期性地檢查application的Busy屬性是否爲$false來確定下載是否完成,下載完成後訪問和修改網頁文件纔是安全的。

(1)用腳本控制瀏覽器進程

下面使用Internet Explorer自動化對象打開瀏覽器窗口並通過Google搜索引擎搜索內容。這裏創建一個名爲“Search-GoogleCom.ps1”的腳本,其中將實例化Internet Explorer、瀏覽搜索引擎、輸入搜索關鍵字並單擊按鈕。然後顯示瀏覽器窗口檢查搜索結果,並繼續瀏覽選擇的條目。該腳本的代碼如下:

function WaitForLoad ($ie)

{

while ($ie.Busy)

{

sleep -milliseconds 50

}

}

$ie = New-Object -COM InternetExplorer.Application

$ie.Navigate("http://www.google.com")

$ie.Visible = $true

WaitForLoad($ie)

$searchBox = $ie.Document.getElementById("q")

$searchBox.value = "`"Windows PowerShell`""

$goButton = $ie.Document.getElementByID("btnG")

$goButton.click();

其中的WaitForLoad函數每隔50毫秒檢查瀏覽器是否處於繁忙狀態,如果繁忙,則繼續等待50毫秒,期間需要調用sleep來釋放由循環佔用的CPU的資源。而對於用戶來說,50毫秒的停頓在等待頁面加載完成時的感覺並不明顯。

加載頁面完成後需要開始操作文檔中的對象,獲取HTML文檔對象通過Document屬性,它支持所有Web開發人員熟悉的方法和屬性。使用getElementById()方法獲取文本框的引用,其中保存搜索關鍵字。搜索按鈕的ID是“btnG”,通過設置文本框的Value屬性可以將關鍵字輸入到文本框中。在腳本中設置的搜索關鍵字是“"Windows PowerShell"”,它由引號引起,這樣可以把其中的空格也作爲搜索內容來匹配整個詞彙。在執行上述操作後調用了按鈕的click()方法,提交表單數據。默認情況下Internet Explorer窗口不可見,通過設置Visible屬性爲$true使窗口可見。圖2-17所示爲該腳本的執行結果。

image

圖1 執行結果

如果需要在不顯示瀏覽器窗口的情況下提取遠程主機中的頁面信息,則使用HTML文檔對象模型(DOM)編程接口。這是一組由W3C組織定義的標準接口,能夠在任何瀏覽器中使用JavaScript代碼操作。有Web編程經驗的讀者會注意到前面有使用getElementById()方法通過Internet Explorer的COM接口調用任何DOM元素的實例。

【提示】

DOM編程接口由W3C組織和微軟共同發佈,其中W3C主要關注在所有瀏覽器上如何運行,而事實上沒有瀏覽器是完全按照標準實施的。微軟主要將W3C的標準落實到Internet Explorer的具體的解析方法上,其DOM解析文檔網址是http://msdn.microsoft.com/en-us/library/
ms533050.aspx。

爲了演示操作HTML DOM對象,創建一個名爲“Get-WebSearchResults.ps1”的腳本。它以靜默方式訪問Google.com,提交查詢並將返回的查詢結果中包含的鏈接頁面打印到控制檯上。這個腳本主要依靠Google.com生成的ID爲“res”的

HTML元素,並從中提取出網頁鏈接。而鏈接是元素包含href屬性,其中包含的URL爲所需。該腳本的代碼如下:

function WaitForLoad ($ie)

{

while ($ie.Busy)

{

sleep -milliseconds 50

}

}

$ie = New-Object -COM InternetExplorer.Application

$ie.Navigate("http://www.google.com")

$ie.Visible = $true

WaitForLoad($ie)

$searchBox = $ie.Document.getElementById("q")

$searchBox.value = "`"Windows PowerShell`""

$goButton = $ie.Document.getElementByID("btnG")

$goButton.click();

WaitForLoad($ie)

$resultsDiv = $ie.Document.getElementById("res")

$links = [object[]] $resultsDiv.getElementsByTagName("a")

$realLinks = $links | where { $_.innerText -ne "Cached page" }

$realLinks | select innerText,href | Format-List

$ie.Quit()

GetElementByTagName()方法返回所有指定標籤的子元素,用戶可以用來獲取頁面中包含的所有“res”元素。在其中過濾鏈接中包含“Cached page”的緩存頁面,因爲這些鏈接僅包含Google緩存服務器中的各版本的緩存,由於沒有大的實際意義,所以這裏將此類內容丟棄。在確認收集的鏈接中包含的innerText和href屬性並將其通過Format-List cmdlet格式化,圖18所示爲該腳本的執行時結果。

圖2 執行結果

PowerShell爲COM對象提供了近乎完美的支持,本文的實例涉及主要的交互性操作,如使用集合和索引屬性。只要不同的應用程序和服務已經具有公開的COM自動化接口,則可嘗試使用COM來提高工作效率。本文介紹了針對Internet Explorer瀏覽器的自動化編程,用戶可以通過以上的介紹擴展到對其他COM對象進行操作。

 

作者: 付海軍
出處:
版權:本文版權歸作者和csdn共有
轉載:歡迎轉載,爲了保存作者的創作熱情,請按要求【轉載】,謝謝
要求:未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
個人網站:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章