我一直在编写一个使用Web浏览器界面运行某些服务器功能的脚本。我使用Internet Explorer 8在Windows 7上编写了脚本,它运行正常。 一旦我将它移动到运行带有Internet Explorer 9的Windows 2008的生产服务器,它就会中断。最后追溯它的失败点,但我有点难过如何解决它。 以下是导致问题的代码:
$ie = new-object -com "InternetExplorer.Application"
$ie.navigate("http://www.google.com")
$ie.visible = $True
$doc = $ie.document
$Object1 = $doc.getElementByID("pocs")
这会弹出一个IE窗口,它应该能够按ID搜索元素。麻烦的是,现在我收到了错误
“无法找到”getElementById“和参数计数的重载: “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()”所以它就在那里,但是没有文件要解析它。
非常感谢任何想法。
答案 0 :(得分:3)
我同样感到惊讶,鉴于该问题在各种技术论坛上的长久性,尚未得到解决。但是我认为我已经找到了解决方案,但微软IE团队需要在某个时候解决这个问题。
与所有已经调查过的线程一样,我遇到了getElementById
方法的同样问题,其中没有对几台测试机器进行其他更改(一台Windows 2008R2 Enterprise 64位和一台Windows 7 32位) ),我可以使用相同的脚本工作。
作为我不喜欢的临时解决方案的解决方法:
所以我开始着手缩小Office通过以下方式启用IE自动化所需的COM对象:
准备新的虚拟Windows 2008R2服务器,无更新。在IE8下运行测试脚本 - 没有问题。
升级到IE11。跑测试脚本 - 像往常一样失败。
获取虚拟机快照
使用Regshot记录注册表和文件系统
执行Office 2013 Pro_SP1安装,不更改默认选项
Office安装完成后,没有运行一次办公室(总之)
再次测试脚本 - 一切正常,IE getElementById
自动化调用全部恢复运行
获得第二个虚拟机快照
使用regshot
进行第二次扫描并分析差异
转储我$ie
对象的属性,并注意到运行Office安装之前的内容远远多于此处。始终引用mshtml.dll
和HTMLDocument
类 - 看起来应该
我可以从RegShot
差异文件中看到MSHTML.dll
已添加并在办公室安装中在GAC(版本7.0.3300.0)中注册
我接下来做的可能不会完全获得批准,但是:
我将microsoft.mshtml.dll
放在"c:\program files(x86)\Microsoft.net\primary interop assemblies"
文件夹中,并将其从VM保存到我的本地计算机桌面
恢复到2013年前办公室快照
将microsoft.mshtml.dll
复制到VM中并安装到GAC(请记住这是一台仍然在.net 2上的2008R2服务器,在IE11安装之前或之后我没有更新.net,只有办公室)。我只需将文件拖到资源管理器中的c:\windows\assembly
视图中即可安装到GAC。在.Net的更高版本中,您需要使用gacutil /l
测试了相同的脚本和BOOM,一切正常。无需更改任何IE设置或提升脚本权限或安装Office
总结一下。如果您安装IE11,要让PowerShell自动化文档模型,我必须(重新)在GAC中注册mshtml.dll
。为什么IE11安装并不能确保这种情况发生在我身边,但我认为IE团队需要对此进行调查。
我也想到那些它只是工作的地方'在IE10 / 11中,您必须在已在GAC(可能是Office,可能是Visual Studio或其他某些MS应用程序)中注册mshtml.dll
的计算机上安装产品。因此,为什么你没有看到明确存在的同样问题。
希望这有助于某人 - 这让我发疯了!
安德鲁
答案 1 :(得分:2)
正如对该问题的评论中所详述的,这个问题似乎有三种解决方案。
答案 2 :(得分:0)
我有类似的问题,并通过以下步骤解决:
检查计算机上的Microsoft.mshtml.dll。它应该位于C:\ Program Files(x86)\ Microsoft.NET \ Primary Interop Assemblies。如果你在这个地方找不到它,可能就是你没有这个dll,这就是你遇到这个问题的原因。
找到dll,并尝试在运行时加载程序集。您可以将dll放在机器上的任何位置并执行此操作。 下面是在运行时加载程序集的方法的链接。 https://onedrive.live.com/?cid=21ad54fd70600673&id=21AD54FD70600673%211922