腐败的IE对象(使用Powershell进行IE自动化)

时间:2015-06-16 08:42:39

标签: internet-explorer powershell automation com-object

我想使用Powershell在Web控制台上自动化访问点配置。

我是在Win8 / IE10上开发的,测试代码时一切正常。 不幸的是,我在开发/测试后收到了“生产系统”。 现在代码应该适用于Windows Server 2012 R2 / IE11。

这是我连接和登录访问点的代码(简化):

$IE = New-Object -ComObject "InternetExplorer.Application"
$IE.Visible = $true #1#
$IE.Navigate("192.168.0.100")
Write-Host $IE.LocationName

$IE.Document.GetElementByID("login-username").Value = "admin"
$IE.Document.GetElementByID("login-password").Value = "admin"
$IE.Document.GetElementByID("login-btn").Click()
Write-Host $IE.LocationName

出于调试原因,我通常会显示窗口(注释#1#)。 首先写入主机,显示正确的位置(“登录”)。 在第二个Write-Host,显示错误的位置(“about:blank”)。 在IE窗口中,您会看到正确的位置/标签名称(“AP”)。 似乎IE对象变得不可用,其他属性(如$ IE.Document。*)则不起作用。我必须手动关闭窗口。

我有两个解决方法:

  1. 当我在登录前手动点击(获取焦点)IE窗口时,它 作品。
  2. 当我不显示窗口($ IE.Visible = $ false)时,也是 一切正常。
  3. 到目前为止我的情景/测试:

    1. IE ESC已禁用。
    2. 我从另一台生产机器(2008R2)复制了C:\ Program Files(x86)\ Microsoft.NET \ Primary Interop Assemblies \ Microsoft.mshtml.dll,因此$ IE.Document函数可以正常工作(来自我的开发机器的dll)产生同样的错误。)。
    3. 我尝试为每个区域启用/禁用保护模式(Internet选项>安全性),对我不起作用(在reddit上找到)
    4. 其他人有想法尝试吗? 调试与解决方法一起工作,生产效率也很好(到目前为止)有不可见的窗口 - 但我想了解麻烦......

      谢谢,最好的问候, KVO

1 个答案:

答案 0 :(得分:0)

我将脚本部署到运行在IE11上的Windows Server 2012后,我遇到了这个问题。

原因是失去了Powershell创建的IE对象的处理程序。

我使用了PowerShell IE9 ComObject has all null properties after navigating to webpage创作的以下代码段来解决此问题。

function ConnectIExplorer() {
    param($HWND)

    $objShellApp = New-Object -ComObject Shell.Application 
    try {
      $EA = $ErrorActionPreference; $ErrorActionPreference = 'Stop'
      $objNewIE = $objShellApp.Windows() | ?{$_.HWND -eq $HWND}
      $objNewIE.Visible = $true
    } catch {
      #it may happen, that the Shell.Application does not find the window in a timely-manner, therefore quick-sleep and try again
      Write-Host "Waiting for page to be loaded ..." 
      Start-Sleep -Milliseconds 500
      try {
        $objNewIE = $objShellApp.Windows() | ?{$_.HWND -eq $HWND}
        $objNewIE.Visible = $true
      } catch {
        Write-Host "Could not retreive the -com Object InternetExplorer. Aborting." -ForegroundColor Red
        $objNewIE = $null
      }     
    } finally { 
      $ErrorActionPreference = $EA
      $objShellApp = $null
    }
    return $objNewIE
  } 




$HWND = ($objIE = New-Object -ComObject InternetExplorer.Application).HWND
$objIE.Navigate("https://www.google.com")
$objIE = ConnectIExplorer -HWND $HWND