方法调用失败,因为[System.Object []]不包含名为“Click”的方法

时间:2013-07-05 19:09:02

标签: internet-explorer powershell com

我正在使用PowerShell运行以下代码,它在一台服务器上成功运行,但在另一台服务器上运行成功。两台服务器都运行带有IE 8的Windows Server R2 Standard。该脚本在管理模式下运行,同样在IE中,“启用保护模式”已关闭,用于本地Intranet。

$ie = new-object -com "InternetExplorer.Application"
$ie.visible = $true 
$ie.Navigate("http://localhost/testwebsite")
While ($ie.Busy) {Sleep 3}
$doc = $ie.Document
$btn = $doc.getElementsByTagName("input")
$Button = $btn | ? {$_.Name -eq "refreshBtn"}
$Button.Click()
$ie.Quit()

这是我在其中一个方框上出现的错误(注意:在另一台机器上没有收到此错误):

Method invocation failed because [System.Object[]] doesn't contain a method named 'Click'.

我需要在服务器上更改安全设置吗?我需要调整脚本吗?还有什么吗?

BTW:我已经检查了StackOverflow上有关此问题的各种帖子,到目前为止我还没有找到任何有帮助的帖子。

提前致谢!

1 个答案:

答案 0 :(得分:4)

不确定为什么它不同,但它看起来像你的管道

$Button = $btn | ? {$_.Name -eq "refreshBtn"}

返回多个按钮,因此$Button实际上是一个数组。 PowerShell 3可以更好地处理这个问题:它实际上会在数组中的每个元素上调用Click()。升级到PowerShell 3可能不是一种选择。

您可以通过几种方式解决此问题。首先,将Click()方法调用添加到找到按钮的管道:

$doc.getElementsByTagName("input") | 
    Where-Object { $_.Name -eq "refreshBtn" } | 
    ForEach-Object { $_.Click() }

当然,如果你回到多个按钮,你可能会认为这是一个错误。在这种情况下,您需要处理它:

$Button = $doc.getElementsByTagName("input") | 
              Where-Object {$_.Name -eq "refreshBtn"}
if( $Button -is 'Object[]' )
{
    Write-Error ('Found multiple <refreshBtn> buttons.')
}