Internet explorer powershell可以等到IE准备好吗?

Internet explorer powershell可以等到IE准备好吗?,internet-explorer,powershell,Internet Explorer,Powershell,我目前正在写一个脚本,我正在使用 while($IE.busy) {Start-Sleep 1} 等待页面准备就绪 页面准备好后,我的脚本将填写并提交表单。我一直遇到问题,因为(我认为)IE报告它在加载页面时完成,但在呈现文档之前完成(这会导致脚本出错)。我目前的解决办法是在页面加载后增加4秒的等待时间,但如果可能的话,我会更喜欢不基于时间的方法。我是这样做的 步骤1-确定一个网页元素,该元素仅在网页完全呈现后出现。我使用ChromeDeveloperTools的“Elements”视图实现了

我目前正在写一个脚本,我正在使用

while($IE.busy) {Start-Sleep 1}
等待页面准备就绪

页面准备好后,我的脚本将填写并提交表单。我一直遇到问题,因为(我认为)IE报告它在加载页面时完成,但在呈现文档之前完成(这会导致脚本出错)。我目前的解决办法是在页面加载后增加4秒的等待时间,但如果可能的话,我会更喜欢不基于时间的方法。

我是这样做的

步骤1-确定一个网页元素,该元素仅在网页完全呈现后出现。我使用ChromeDeveloperTools的“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"

我发现这条线索真的很有帮助,并最终提出了一个稍微不同的解决方案。我对powershell还很陌生,所以希望我没有弄糟它,但这对我来说真的很好

我使用了一个“while”语句,以便我的条件在为true时循环:

while($ie.document.body.outerHTML -notMatch "<input type=`"submit`" value=`"Continue`">") {start-sleep -m 100};
您可以直观地进行挖掘,然后向下过滤到您想要的部分,这将加快匹配速度(我猜),这就是我在上面的代码示例中所做的

我唯一要注意的是。。。我认为-match使用“regex”,因为我必须使用记号(例如,`)来转义作为匹配字符串一部分的引号

干杯

以下是关于“while”逻辑的一个很好的参考:

我假设您使用的是
InternetExlporer.Application
COM对象?如果是这样,您可能无法订阅事件,因为它不是.NET对象。如果它是.NET对象,则可以使用
Register ObjectEvent
连接事件处理程序。正确,我使用的是IE COM对象。所以我想把等待时间延长到我认为安全的时间是唯一的选择?据我所知,是的,基于时间的检查是你最好的选择。如果在一段时间后(例如5分钟),您想停止检查,可以在
while
循环中使用
break
语句。等等,您是说我可以检查DOM是否准备好了?现在我根本不检查。我只是等待IE不忙(我认为它只捕获网络活动),然后尝试在开始与DOM交互之前等待一段安全的时间。我能在与DOM交互之前检查它是否准备好了吗?我可以把它放在计时器上。我的问题是,我甚至不知道我可以检查它,我在计时器上的代码实际上是与页面交互的代码(填写表单),如果DOM还没有准备好,显然会失败。抱歉-之前的评论是匆忙发布的,不完整。一旦有了innerHtml,我就会解析它,寻找一个特定的元素,这个元素只有在呈现页面时才会出现。一旦找到这个,我知道页面已完全加载。混乱,但到目前为止,它是可靠的。我看不到IE在完全呈现页面时“知道”的任何其他方式。
$ie.document.body