【问题标题】:Powershell Web Page Automation works on Internet, not IntranetPowershell 网页自动化适用于 Internet,而不是 Intranet
【发布时间】:2013-08-08 03:17:21
【问题描述】:

我正在尝试使用 Powershell 进行一些简单的自动化操作,从我们公司的一个本地 Intranet 页面中提取链接 URL,然后对这些 URL 进行一些处理。最后,我将使用脚本打开每个链接并单击页面上的按钮。我在 Windows 7 x64 中使用 Internet Explorer 9。

下面是一个简单的 powershell 脚本示例,它显示页面上的所有链接:

$ie = new-object -com "InternetExplorer.Application"
$ie.Visible = $true
$ie.Navigate( "http://www.reddit.com" )
While ($ie.Busy) {
    Sleep 1
}

$links = $ie.Document.getElementsByTagName("a")
$links | foreach {
    write-host $_.href
}

在我将 URL 替换为本地 Intranet 站点之前,此脚本工作正常。它遵循正常的 URL 方案 (http://internaldomain.com/etc),但它被识别为 Intranet 站点。一旦我尝试在 Intranet 区域中抓取页面,$ie.Document 值突然变为 NULL,脚本失败。

我猜这与该区域的一些模糊设置有关...我不确定。我在网上找到了一些建议,例如将其添加到您信任的站点,但没有奏效。这是我第一次使用 Powershell 进行 Web 自动化,所以任何帮助或见解将不胜感激。

【问题讨论】:

  • 不回答你的问题,但是在 PS 中你可以使用Web-Client 对象来抓取网页,而不是创建一个 IE 实例。
  • 比较两个页面的区域安全设置。

标签: powershell automation internet-explorer-9


【解决方案1】:

也许解决方案在这里:http://blogs.msdn.com/b/ieinternals/archive/2011/08/03/internet-explorer-automation-protected-mode-lcie-default-integrity-level-medium.aspx

它解释了不同级别的选项卡,在 ie 中。您必须使用“中标签”在本地区域中导航。

基本上,保留 ie 设置和使用脚本的最佳方法是创建一个注册表项,如上面的链接中所述。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\InternetExplorer.ApplicationMedium]

[HKEY_CLASSES_ROOT\InternetExplorer.ApplicationMedium\CLSID] 
@="{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}"

在你的脚本中,使用这个新的 com 对象:

$ie = new-object -Com InternetExplorer.ApplicationMedium
...

【讨论】:

    【解决方案2】:

    由于我的计算机上的政策限制,我无法访问注册表来创建另一个答案中提到的密钥。但是,我确实找到了一种使用 PowerShell 间接执行此操作的方法,以防对其他人有帮助:

    $type = [Type]::GetTypeFromCLSID('D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E')
    $ie = [System.Activator]::CreateInstance($Type)
    
    $ie.Visible = $true
    
    $URL = "http://my.intranet.com"
    
    $ie.Navigate($URL)
    
    Write-Host "`$ie.Busy:" $ie.Busy
    Write-Host "`$ie.ReadyState:" $ie.ReadyState
    
    while($ie.Busy -or ($ie.ReadyState -ne 4) ) {
        Start-Sleep -s 1
    }
    
    Write-Host "IE is ready"
    

    【讨论】:

      【解决方案3】:

      使用

      $ie.Document.documentElement.getElementsByClassName("underline")
      

      并享受.....

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2016-02-14
      • 2018-02-17
      • 2019-05-21
      相关资源
      最近更新 更多