如何使用PowerShell在新窗口中引用框架中的内容?

时间:2014-07-22 19:31:41

标签: html windows internet-explorer powershell frames

我使用PowerShell登录网络应用。登录后,该应用程序将打开一个新窗口。新窗口有一个框架,有三个框架。我试图点击其中一个框架中的链接("左和#34;)。

$ie = New-Object -ComObject "InternetExplorer.Application"
$ie.navigate("http://example.local")
while($ie.ReadyState -ne 4) { Start-Sleep -Seconds 5 }
$ie.visible = $true
$doc = $ie.document

$userField = $doc.getElementById("uid")
$passwordField = $doc.getElementById("pwd")
$submitButton = $doc.getElementById("submit")

$userField.value = "userid"
$passwordField.value = "*****"
$submitButton.click()

$shell = New-object -ComObject "Shell.Application"
# The app opens a new window with a timestamp - that's the window I want, so I skip the other window
$ie2 = $shell.Windows() | where {$_.Type -eq "HTML Document" -and $_.LocationName -ne "My App - Parent Window"}
$doc2 = $ie2.document
$frames = @($doc2.getElementsByTagName("FRAME"))
Write-Host $frames.Count # shows "3"
Write-Host $frames[1].Title # shows "Left Nav"

如何引用左框架?我尝试了各种我认为可行的组合,主要是$frames[1].document.something...的一些变体。

HTML(不是我的代码):

<frameset rows="60,*">
    <frame src="http://example.local/really/long?url" title="Top Nav" name="Top" id="Top">
    <frameset cols="175,*">
        <frame src="http://example.local/left.html" title="Left Nav" name="Left" id="Left">
        <frame src="http://example.local/main.html" title="Main Display" name="Main" id="Main">
    </frameset>
</frameset>

我没有使用$ frames数组,而是使用@Adi建议的frames属性。

$frames = $doc2.frames
$left = $frames.item([ref]1).document      # the frame I need
$left_frames = $left.frames                # this page has frames too
$nav = $left_frames.item([ref]0).document  # the frame I need
$nav.body.outerHTML                        # gives me the code I need

1 个答案:

答案 0 :(得分:2)

不是通过调用Document对象的 GetElementsByTagName()方法将帧读入元素数组,而是使用Document对象的框架 property,它将返回专门用于与框架交互的对象:

$frames = $ie2.document.frames

返回表示所有帧的对象。要引用单个框架,$frames[1]无法正常工作,因为 $ frames 不是一个集合,因此您无法将其编入索引。它是一个ComObject,而表示相同类型项的分组的ComObject通常具有 Item 方法,用于通过将索引号指定为参数来引用该组中的各个项。使用$frames | gm检查可用的属性和方法,您可以看到实际上存在方法。

我不确定索引编号是如何分配给框架的,但可能是从左到右,然后从上到下的方案,所以如果你有一个顶部,左,右框架,它是一个安全的赌注,索引号将是1.试试这个:

$frames.item(1).document.something...