【问题标题】:Method invocation failed because [System.Object[]] doesn't contain a method named 'Click'方法调用失败,因为 [System.Object[]] 不包含名为“Click”的方法
【发布时间】:2013-07-03 22:39:53
【问题描述】:

我正在使用 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'.

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

顺便说一句:我已经查看了 StackOverflow 上有关与此相关的问题的各种帖子,但到目前为止我还没有发现任何有用的信息。

提前致谢!

【问题讨论】:

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

标签: internet-explorer powershell com


【解决方案1】:

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

$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。页面上实际上有两个按钮,我需要同时单击,所以上面的解决方案效果很好。
  • 您的Foreach-Object... click() 有效,但为什么getElementsByTagName(...)[0].Click() 无效?我正在选择数组中的第一项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多