上一篇文章主要介紹了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所示爲該腳本的執行結果。
圖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”的
$ie = New-Object -COM InternetExplorer.Application
$ie.Navigate("http://www.google.com")
$searchBox = $ie.Document.getElementById("q")
$searchBox.value = "`"Windows PowerShell`""
$goButton = $ie.Document.getElementByID("btnG")
$resultsDiv = $ie.Document.getElementById("res")
$links = [object[]] $resultsDiv.getElementsByTagName("a")
$realLinks = $links | where { $_.innerText -ne "Cached page" }
$realLinks | select innerText,href | Format-List