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

3

我正在使用PowerShell运行以下代码,它在一个服务器上成功运行,但在另一个服务器上失败。两台服务器都运行Windows Server R2标准版,并且都安装了IE 8。脚本在管理员模式下运行,在IE中,“启用保护模式”已关闭Local 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'.

我需要更改服务器上的安全设置吗?我需要调整我的脚本吗?还有其他需要注意的事项吗?

顺便说一下:我已经检查过StackOverflow上与此相关的各种帖子,但目前还没有找到有用的信息。

提前感谢!


5
我的猜测是有不止一个名为“refreshBtn”的按钮;这就是为什么 $button 是一个按钮类型的数组,而不是一个具有 click() 方法可调用的单个按钮。 - CB.
是的,你说的对。有两个带有“refreshBtn”的按钮。 - Keith
我对我的代码进行了以下更改,现在它可以工作了:$Button[1].Click()。感谢 C.B 的提示! - Keith
1个回答

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.')
}

感谢您的反馈,Splattered Bits。页面上实际上有两个按钮,我需要点击两个按钮,所以您上面提供的解决方案很好。 - Keith
你的 Foreach-Object... click() 能够工作,但为什么 getElementsByTagName(...)[0].Click() 不能工作呢?我正在选择数组中的第一个项目。 - The Muffin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接