PowerShell可以等到IE准备好了吗?

时间:2014-03-19 15:34:05

标签: internet-explorer powershell

我目前正在编写一个脚本而且我正在使用

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

等待页面准备就绪。

页面准备好后,我的脚本会填写并提交表单。我一直在遇到问题,因为(我认为)IE报告它在页面加载时但在文档被渲染之前完成(导致脚本错误)。我目前的解决方法是在页面加载后添加4秒的等待时间,但如果可能的话,我觉得使用基于时间的方法会更舒服。

2 个答案:

答案 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/