3

我正在使用 webbrowser 控件加载网页,其中有一个由 javascript 生成的表单。

当我尝试访问 c# 中的元素时,找不到它们。

该页面在普通浏览器中呈现良好,但在我的 winforms 应用程序中,表单元素未呈现,我只能在调试时看到生成表单的 javascript

我在堆栈上找到的一个接近的解决方案是将 to 强制webbrowser.document.domdocument转换ihtmldocument,但我没有成功,

这就是我想做的

Dim doc As HtmlDocument = DirectCast(wbMain.Document.DomDocument, MSH.IHTMLDocument)

但我收到了这个警告

将“mshtml.IHTMLDocument”转换为“System.Windows.Forms.HtmlDocument”时可能会出现运行时错误。

当我忽略并运行时,我收到了这个错误

无法将类型为“mshtml.HTMLDocumentClass”的 COM 对象转换为类类型“System.Windows.Forms.HtmlDocument”。表示 COM 组件的类型的实例不能转换为不表示 COM 组件的类型;但是,只要底层 COM 组件支持对接口的 IID 的 QueryInterface 调用,它们就可以转换为接口。

编辑示例 javascript

<SCRIPT type=text/javascript>  
        (function(){            
        function runElemGen() {
       var ElemGenForm = [{"label":"Email:","name":"ElemGen_email_field","oldName":"","value":"","ElemGen":"text"},{"label":"","name":"ElemGensubscribe","oldName":"","value":"Submit","ElemGen":"submit"}];
       ElemGenBuildForm({makeDivs: true, arr:ElemGenForm, place:"ElemGen-email-form-"});                
        }
      if (window.addEventListener) {
        window.addEventListener("load", runElemGen, false);
      } else {
        window.attachEvent("onload", runElemGen);
      }
    })();
</SCRIPT>

任何有解决方案的人都可以帮忙吗

4

2 回答 2

3

编辑:下面的解决方案修复了 OP 无法访问 dom 以进行调试。OP 实际上需要解决文档在WebBrowserControl. 这WebBrowserControl是对同名 ActiveX 控件的重新打包,因此可能会使用当前安装的 Internet Explorer 版本。如果可能的话,我建议在有问题的计算机上启动 IE 并尝试呈现相同的文档,包括用于加载文档的代码WebBrowserControl也可以帮助我们诊断问题。

我认为您想要以下内容:

if (webBrowser1.Document != null)
{
    var currentDoc = (MSHTML.IHTMLDocument2)webBrowser1.Document.DomDocument;
    return (currentDoc.lastModified);
}

您从IHTMLDocumenttoHtmlDocument的转换无效。

这是IHTMLDocument2属性和方法文档。

在上面的例子中,扩展它webBrowser1.Document是一个System.Windows.Forms.HtmlDocument. 它的DomDocument属性是一个指向文档的非托管指针。Document仅当您查找未在浏览器控件的托管属性上公开的文档属性时才需要它。

于 2012-09-23T18:52:12.807 回答
0

您确实说过生成的表单没有显示在您的 webbrowser 控件中,所以我猜它显示在您的正常 Internet Explorer 会话中,我是否正确?您是否意识到,当您运行 WebBrowser 控件时,它是在 IE 7.0 渲染引擎下运行的?这样做是为了兼容性。因此,如果您的 JS 中有任何需要 IE 8.0 或更高版本的内容,除非您专门更改某些注册表设置(或进行元数据标记插入),表明您希望内容在当前安装的 IE 版本,或您选择的特定固定版本。

如果这是问题所在,我对以下问题的回答几乎肯定会解决您的问题。您可以在此处找到它:脚本在 dotnet WebBrowser 控件中运行速度较慢

让我知道它是怎么回事,如果它解决了你的问题,如果没有,我会和你一起工作,直到我们找到解决方案。

于 2012-10-02T09:23:04.900 回答