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