如何使用Powershell与Iframe交互?

时间:2010-10-15 14:55:57

标签: iframe powershell automated-tests testing

我正在尝试自动化网站,发现自己需要访问iframe的内容。由于这是一个内部应用程序,我已经放入了这个示例,它说明了错误

$ie = new-object -com "InternetExplorer.Application" 
$ie.navigate("http://arstechnica.com/") 

$ie.visible = $true 
$doc = $ie.document 
$maglistcontrol = $doc.getElementById("mag_list") 
$maglistcontrol.value= "Concierge"

以下是我收到的错误消息

You cannot call a method on a null-valued expression.
At line:6 char:38
+ $maglistcontrol = $doc.getElementById <<<< ("mag_list") 
    + CategoryInfo          : InvalidOperation: (getElementById:String) [], RuntimeExce 
   ption
    + FullyQualifiedErrorId : InvokeMethodOnNull

Property 'value' cannot be found on this object; make sure it exists and is settable.
At line:7 char:17
+ $maglistcontrol. <<<< value= "Concierge"
    + CategoryInfo          : InvalidOperation: (value:String) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound

问题是,mag_list字段位于iframe中且引用无效。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

以下代码对我有用,有些信息来自http://www.dyn-web.com/tutorials/iframes/

# give your url here in this line instead of sample url
& "$env:programfiles\Internet Explorer\iexplore.exe" 'http://blahblahblah'
$win = New-Object -comObject Shell.Application
$try = 0
$ieObj = $null
do {
  Start-Sleep -milliseconds 500

# plese use your title instead of "your_title"  to identify the window correct
$ieObj = @($win.windows() | ? { $_.locationName -like '*your_title*' })[0]

$try ++
if ($try -gt 20) {
 Throw "Web Page cannot be opened."
 }
} while ($ieObj -eq $null)

[System.Threading.Thread]::Sleep(1000) 

# put both Iframe name and id both to "fraMain" 
$ieObj.document.getElementbyID("fraMain").contentWindow.document.getElementbyID("name").value = "test name"
$ieObj.document.getElementbyID("fraMain").contentWindow.document.getElementbyID("button").Click()

希望这有帮助

答案 1 :(得分:0)

我尝试这样做但是无法成功地从PowerShell操作IE(很奇怪;我得到了一个$ ie变量,但之后的所有访问都失败了。)

框架位于Window对象中:框架集合。

理论上,你可以通过$ ie.document.parentWindow获取窗口对象。

所以,这应该可行,但我无法测试它:

$doc = $ie.document
$w = $doc.parentWindow
$fr = $w.frames[0] # assuming you want the first frame
$uidfield = $fr.document.getElementById("uid")

希望这有帮助。

答案 2 :(得分:0)

看起来您的问题是COM对象变得无法使用。我已经看到有时会产生一个新的IE对象来处理请求(我不知道为什么,也许有人知道)。你需要再次找到这样的窗口:

$Shell = New-Object -COM Shell.Application
$Shell.Windows()  ## Find the right one in the list

$ie = $Shell.Windows().Item(1)  ## Grab the window

但我无法找到您正在寻找的“mag_list”标签。