4

我想使用MSHTML [1] 来访问IE中的DOM,但是我刚刚发现它在HTML文档类中缺少querySelector和querySelectorAll方法,否则对于通过CSS选择器获取文档中的元素非常有帮助。

我现在能想到的唯一解决方法是通过执行脚本来完成所有事情,但这很糟糕。

是否有任何具有两种方法(querySelector 和 querySelectorAll)的 MSHTML 版本?是否有任何其他库(希望是 Microsoft 的官方 .Net 库)可以使用这两种方法或其等效方法?

[1] %ProgramFiles(x86)%\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll

4

2 回答 2

8

querySelector() 方法和朋友们在 MSHtml 和 IE DOM 中还活得很好,问题是大多数程序员在他们的机器上拥有的 PIA 已经严重过时了。我机器上在 GAC 中注册的版本号为 7.0.3300.0,可以追溯到 2002 年。

有一种解决方法,您可以生成自己的互操作库并避免 GAC 中的互操作库。诀窍是通过创建没有强名称的互操作程序集来故意生成不匹配,因此它无法匹配 GAC 中的程序集。确保仅在 VS2010 或更高版本上执行此操作,您想利用嵌入互操作类型功能。

启动 Visual Studio 命令提示符并导航到您的项目目录。并执行此命令:

  Tlbimp c:\windows\system32\mshtml.tlb

它会滚动几分钟,类型库非常大,并且会吐出几个看起来很恶心的警告,你可以忽略它们。返回 VS,删除现有的 MSHTML 引用并使用添加引用,浏览选项卡。选择由 Tlbimp 生成的 MSHTML.dll 文件。

请记住,您现在使用的互操作库与您机器上的 IE 版本兼容。不一定是您的用户拥有的版本,因此从技术上讲,您的程序可能会失败。你一定很倒霉。

于 2014-01-16T19:16:14.927 回答
1

昨天我注意到同样的问题,我找到了解决方案。

下一个示例代码适用于我:

Document.querySelectorAll("#navbar_search>a").item(0).click();

如果我尝试做“相同的事情”,但是使用此代码,它将失败:

HTMLDocument doc;
doc = ie.Document;
doc.querySelectorAll("#navbar_search>a").item(0).click();

我不是 COM 专家,但我认为第一个解决方案是后期绑定(依赖关系在运行时解决),而第二个解决方案是编译器时绑定,它依赖于“良好”的预定义库,这不是mshtml的情况。

于 2016-09-26T18:21:18.630 回答