我目前正在编写一个脚本而且我正在使用
while($IE.busy) {Start-Sleep 1}
等待页面准备就绪。
页面准备好后,我的脚本会填写并提交表单。我一直在遇到问题,因为(我认为)IE报告它在页面加载时但在文档被渲染之前完成(导致脚本错误)。我目前的解决方法是在页面加载后添加4秒的等待时间,但如果可能的话,我觉得使用基于时间的方法会更舒服。
答案 0 :(得分:7)
这是我如何做到的。
步骤1 - 确定仅在页面完全呈现后才出现的网页元素。我使用Chrome开发人员工具' Elements'显示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"
答案 1 :(得分:2)
我发现这个帖子非常有用,最终得出了一个略有不同的解决方案。我对powershell很陌生,所以我希望我没有对它进行讨论,但这对我来说非常有用。
我使用"而#34;声明,以便我的条件循环为真:
while($ie.document.body.outerHTML -notMatch "<input type=`"submit`" value=`"Continue`">") {start-sleep -m 100};
在这种情况下,我正在匹配&#34; outerHTML&#34;身体的一部分。只要我不匹配指定的文本,脚本就会等待并继续循环匹配检查。
我喜欢这个解决方案,因为我可以在或多或少的一行代码中完成它,我喜欢在可能的情况下保持紧凑。希望这对其他人有帮助。就像OP一样,我发现ie.readystate非常吝啬/不可靠,但我真的不想把静态睡眠定时器放进去。
此外,虽然Chrome是打破页面的绝佳方式。只需运行以下命令,即可通过以编程方式运行IE,也可以打印到控制台窗口:
$ie.document.body
你可以直观地挖掘,然后过滤到你想要的部分,这应该加快你的匹配(我猜),这就是我在上面的代码示例中所做的。
我要注意的另一件事......我认为-match使用&#34; regex&#34;因为我必须使用刻度线(例如`)来转义作为我匹配的字符串一部分的引号。
干杯!
这是一个很好的参考&#34;而&#34;逻辑: http://www.powershellpro.com/powershell-tutorial-introduction/logic-using-loops/