2014-03-19 60 views
5

我目前正在寫一個腳本,我使用PowerShell可以等到IE準備好了嗎?

while($IE.busy) {Start-Sleep 1} 

等待頁面做好準備。

一旦頁面準備好了,我的腳本就會填寫並提交表單。我一直在遇到問題,因爲(我認爲)IE報告說,它是在頁面加載完成但文檔已被渲染之前完成的(這會導致腳本出錯)。我目前的解決方法是在頁面加載後添加4秒鐘的等待時間,但如果可能的話,我會覺得更適合不是基於時間的方法。

+1

我會假設你使用了'InternetExlporer.Application' COM對象?如果是這樣,您可能無法訂閱事件,因爲它不是.NET對象。如果它是一個.NET對象,那麼可以使用'Register-ObjectEvent'來掛接事件處理程序。 –

+0

正確,我正在使用IE COM對象。所以我想增加等待時間到我認爲安全的時間是唯一的選擇? –

+1

據我所知,是的,基於時間的檢查是你最好的選擇。如果在一段時間後(例如5分鐘),你想停止檢查,你可以在'while'循環中使用'break'語句。 –

回答

2

下面是我如何做到這一點。

第1步 - 識別一個網頁元素,只有在頁面完全呈現後纔會出現。我使用Chrome開發人員工具的「元素」視圖來顯示DOM視圖。

第2步 - 在腳本中建立一個等待循環,用於輪詢元素的存在或該元素內的文本的值。

# Element ID to check for in DOM 
$elementID = "systemmessage" 

# Text to match in elemend 
$elementMatchText = "logged in" 

# Timeout 
$timeoutMilliseconds = 5000 

$ie = New-Object -ComObject "InternetExplorer.Application" 

# optional 
$ie.Visible = $true 

$ie.Navigate2("http://somewebpage") 
$timeStart = Get-Date 
$exitFlag = $false 

do { 

    sleep -milliseconds 100 

    if ($ie.ReadyState -eq 4) { 

     $elementText = (($ie.Document).getElementByID($elementID)).innerText 
     $elementMatch = $elementText -match $elementMatchText 

     if ($elementMatch) { $loadTime = (Get-Date).subtract($timeStart) } 

    } 

    $timeout = ((Get-Date).subtract($timeStart)).TotalMilliseconds -gt $timeoutMilliseconds 
    $exitFlag = $elementMatch -or $timeout 

} until ($exitFlag) 

Write-Host "Match element found: $elementMatch" 
Write-Host "Timeout: $timeout" 
Write-Host "Load Time: $loadTime" 
2

我發現這個線程真的很有幫助,並最終提出了一個稍有不同的解決方案。我對PowerShell相當陌生,所以希望我沒有對它進行散列,但這對我來說真的很好。

我用了「而」語句,使我的病情會循環而真實:

while($ie.document.body.outerHTML -notMatch "<input type=`"submit`" value=`"Continue`">") {start-sleep -m 100}; 

在這種情況下,我對匹配身體的「outerHTML」部分的一部分。只要我不匹配指定的文本,腳本就會等待並繼續循環匹配檢查。

我喜歡這個解決方案,因爲我可以用或多或少的一行代碼來完成它,並且我喜歡在可能的情況下保持緊湊。希望這對其他人有幫助。就像OP一樣,我發現ie.readystate非常簡陋/不可靠,但我真的不想只放一個靜態的睡眠定時器。

另外,雖然Chrome是一種很好的方式來打開一個頁面。您還可以打印到控制檯窗口,一旦你有IE只需運行程序運行:

$ie.document.body 

您可以通過直觀地挖,然後篩選到你想要的應該加快您匹配的部分(我猜) ,這是我在上面的代碼示例中所做的。

我會注意到的唯一其他事情......我認爲-match使用「正則表達式」,因爲我必須使用刻度標記(例如``)來轉義作爲我匹配的字符串的一部分的引號。

乾杯!

這裏是「而」邏輯一個很好的參考: http://www.powershellpro.com/powershell-tutorial-introduction/logic-using-loops/