Powershell System.__ComObject.document 属性在 IE 9 下不再有效

标签 powershell internet-explorer-9

我一直在编写一个使用网络浏览器界面运行某些服务器功能的脚本。我使用 Internet Explorer 8 在 Windows 7 上编写了脚本,它运行良好。 一旦我将它移动到运行 Windows 2008 和 Internet Explorer 9 的生产服务器上,它就会崩溃。终于找到了故障点,但我对如何修复它有点难过。 以下是会导致问题的代码:

$ie = new-object -com "InternetExplorer.Application"
$ie.navigate("http://www.google.com")
$ie.visible = $True
$doc = $ie.document
$Object1 = $doc.getElementByID("pocs")

这会弹出一个 IE 窗口,它应该可以通过 ID 搜索元素。问题是,现在我得到了错误

"Cannot find an overload for "getElementById" and the argument count: "1"."

我对这个错误的了解非常少。实际问题实际上是变量 $doc。如果我在 IE 9 上执行“$doc | get-member”,我会得到:

TypeName: System.__ComObject#{c59c6b12-f6c1-11cf-8835-00a0c911e8b2}

但在 IE 8 下我得到:

  TypeName: mshtml.HTMLDocumentClass

所以,基本上,当我调用 $ie.document 时,IE 9/Windows 2008 无法加载 Web 文档内容。我试过将 IE9 设置为兼容模式,但没有成功。

$ie.document | get-member 实际上显示了以下方法:“getElementById Method Variant getElementById () ”所以它就在那里,但是没有要解析的文档。

任何想法将不胜感激。

最佳答案

考虑到这个问题在各种技术论坛上的长期存在,我同样感到惊讶的是,这个问题还没有得到解决。不过,我认为我已经找到了解决方案,尽管这将由 Microsoft IE 团队在某个时候解决。

像所有引用过的线程一样,我在 getElementById 方法中遇到了同样的问题,没有对几台测试机(一台 Windows 2008R2 Enterprise 64 位和一台Windows 7 32 位),我可以使用相同的脚本。

作为我不喜欢的临时解决方案的解决方法:

  1. 使用 IE11 中的开发控制台,将文档模式切换为 8(9、10、11、Edge(默认)不工作)——我的自动化脚本立即工作。 IE 可信站点、区域安全、保护模式、PowerShell session 权限没有变化)。很明显,这只是某种 IE11 安装的组件问题
  2. 安装 Office 2013,无需运行或许可,同样的脚本可以立即运行,无需更改 IE11 的文档模式。显然 Office 确实安装/注册了解决问题的东西(正如 Rhys Edwards 所说)

因此,我着手通过以下方式缩小 Office 为启用 IE 自动化所需的 COM 对象所做的工作:

  1. 准备新的虚拟 Windows 2008R2 服务器,无更新。在 IE8 下运行测试脚本 - 没有问题。

  2. 已升级到 IE11。运行测试脚本 - 像往常一样失败。

  3. 拍摄虚拟机快照

  4. 使用Regshot记录注册表和文件系统

  5. 运行 Office 2013 Pro_SP1 安装,不更改默认选项 当 Office 安装完成时,没有运行一次 office(从来没有) 再次运行测试脚本 - 一切正常,带有 getElementById 的 IE 自动化调用全部恢复运行

  6. 拍摄第二个 VM 快照

  7. 使用 regshot 进行第二次扫描并分析差异

  8. 转储了我的 $ie 对象的属性,并且还注意到那里的属性比运行 Office 安装之前要多得多。整个过程中都引用了 mshtml.dllHTMLDocument 类 - 看起来应该是这样

  9. 我可以从 RegShot 差异文件中看到,MSHTML.dll 已通过 office 安装添加并注册到 GAC(版本 7.0.3300.0)中

我接下来做的可能不会完全被认可但是:

  1. 我在 "c:\program files(x86)\Microsoft.net\primary interop assemblies" 文件夹中找到了 microsoft.mshtml.dll 并且将其从 VM 中保存到我的本地计算机桌面

  2. 恢复到 2013 年办公室快照

  3. microsoft.mshtml.dll 复制到 VM 中并安装到 GAC(请记住,这是仍在 .net 2 上的 2008R2 服务器,我之前没有更新 .net或者安装 IE11 后,只有 office)。我只是通过将文件拖到资源管理器中的 c:\windows\assembly View 来安装到 GAC。在更高版本的 .Net 中,您需要使用 gacutil/l

  4. 测试了相同的脚本和 BOOM,一切正常。无需更改任何 IE 设置或提升脚本权限或安装 Office

总结一下。如果您安装 IE11,为了让 PowerShell 自动执行文档模型,我必须在 GAC 中(重新)注册 mshtml.dll。为什么 IE11 安装不能确保发生这种情况超出了我的范围,但我认为 IE 团队需要对此进行调查。

我还认为对于那些在 IE10/11 中“正常工作”的产品,您的机器上必须有一个已经在 GAC 中注册了 mshtml.dll 的产品(也许是 Office,也许是Visual Studio 或其他一些 MS 应用程序)。因此,为什么您没有看到肯定存在的相同问题。

希望这对某人有所帮助 - 它快把我逼疯了!

安德鲁

关于Powershell System.__ComObject.document 属性在 IE 9 下不再有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12733143/

相关文章:

powershell - 使用 windows 命令行获取每个内核的 CPU 使用率

jquery - 当我在 Fixed Bar 中使用时,下拉菜单在 Internet Explorer 9 中不起作用

javascript - IE9 悬停错误 - 移动一行后悬停状态保持不变

css - IE9 中的 CSS 文件大小有限制吗?

css - 如何在 ie9 上应用高度 css 属性?

css - 为什么IE9需要meta标签来渲染圆 Angular ?

powershell - 如何从命令行运行 Powershell 脚本并将目录作为参数传递

powershell - 递归计数文件夹树的文件

sorting - powershell 排序多维数组

powershell - Azure 自动化错误 'DynamicActivity' : Expected an input parameter value of type