我使用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
答案 0 :(得分:2)
不是通过调用Document对象的 GetElementsByTagName()方法将帧读入元素数组,而是使用Document对象的框架 property,它将返回专门用于与框架交互的对象:
$frames = $ie2.document.frames
返回表示所有帧的对象。要引用单个框架,$frames[1]
无法正常工作,因为 $ frames 不是一个集合,因此您无法将其编入索引。它是一个ComObject,而表示相同类型项的分组的ComObject通常具有 Item 方法,用于通过将索引号指定为参数来引用该组中的各个项。使用$frames | gm
检查可用的属性和方法,您可以看到实际上存在项方法。
我不确定索引编号是如何分配给框架的,但可能是从左到右,然后从上到下的方案,所以如果你有一个顶部,左,右框架,它是一个安全的赌注,索引号将是1.试试这个:
$frames.item(1).document.something...