我目前正在寫一個腳本,我使用PowerShell可以等到IE準備好了嗎?
while($IE.busy) {Start-Sleep 1}
等待頁面做好準備。
一旦頁面準備好了,我的腳本就會填寫並提交表單。我一直在遇到問題,因爲(我認爲)IE報告說,它是在頁面加載完成但文檔已被渲染之前完成的(這會導致腳本出錯)。我目前的解決方法是在頁面加載後添加4秒鐘的等待時間,但如果可能的話,我會覺得更適合不是基於時間的方法。
我目前正在寫一個腳本,我使用PowerShell可以等到IE準備好了嗎?
while($IE.busy) {Start-Sleep 1}
等待頁面做好準備。
一旦頁面準備好了,我的腳本就會填寫並提交表單。我一直在遇到問題,因爲(我認爲)IE報告說,它是在頁面加載完成但文檔已被渲染之前完成的(這會導致腳本出錯)。我目前的解決方法是在頁面加載後添加4秒鐘的等待時間,但如果可能的話,我會覺得更適合不是基於時間的方法。
下面是我如何做到這一點。
第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"
我發現這個線程真的很有幫助,並最終提出了一個稍有不同的解決方案。我對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/
我會假設你使用了'InternetExlporer.Application' COM對象?如果是這樣,您可能無法訂閱事件,因爲它不是.NET對象。如果它是一個.NET對象,那麼可以使用'Register-ObjectEvent'來掛接事件處理程序。 –
正確,我正在使用IE COM對象。所以我想增加等待時間到我認爲安全的時間是唯一的選擇? –
據我所知,是的,基於時間的檢查是你最好的選擇。如果在一段時間後(例如5分鐘),你想停止檢查,你可以在'while'循環中使用'break'語句。 –