[转]从C#中访问DHTML DOM对象
从C#中访问DHTML DOM对象
http://www.zzchn.com/edu/20080727/91906.shtml
C# 实现基本思路为:使用从CDHtmlDialog或者CHtmlView继承的类来创建一个浏览器窗口,并打开你指定的URL。
在DocumentComplete事件(虚函数)中获得浏览器容器的IHTMLDocument2接口(文档接口)。
从文档接口中扫描DOM树,寻找你希望的FORM元素。
扫描FORM中的各个IHTMLInputElement,如果是你希望赋值的,就执行IHTMLInputElement::put_Value()赋值。
调用IHTMLFormElement::submit()方法实现提交
**************************
C#利用WebBrowser操作HTML
这两天,给一个朋友写一个网站的注册机。注册机的写法有很多种,比较常用的是利用WebBrowser、WebClient和 HttpWebRequest三者任意一个来实现。对比三者的方法,WebBrowser算是最
简单、也最适合初学者的了。因为你只需要利用代码配合 WebBrowser操作一下HTML就能实现。WebClient比较适中,能实现很多WebBrowser无法直接实现的效果。 HttpWebRequest是三者中最底
层、也是最难的一个,但也比较强大、方便。
这次我写的注册机,就选用的WebBrowser。为什么呢?是因为我懒得去分析那些HTTP请求。况且要是注册失败了,用 HttpWebRequest还得要分析返回的结果,告诉用户为什么失败。我用了
WebBrowser,要是失败了,让用户自己看去,我就不用管那么多了。
在VB6的时代,要用WebBrowser来操作HTML还真的是简单多了。可能因为IHTMLDocument的借口问题吧,要方便地操作HTML只要在VB6里用COM就可以了;C#里都是托管的安全代码,实现
起来不太方便。
在实践的过程中,设置文本框的值倒是好搞,两三下就搞定了。可最麻烦的问题是,提交的按钮我点不了,<form>标签也无法提交。因为 C#里面只有HtmlElement类
(System.Windows.Forms.HtmlElement),没有VB6.0里面那种 HTMLButton类,也无法将HtmlElement类的对象转换为C#的HtmlButton类(System.Web.UI.HtmlControls.HtmlButton)。HTML里的
所有标签(包括<input> 和<form>)都只能用HtmlElement类来接收。因为HtmlElement类是没有提交和点击方法的,所以就无法成功注册了。
C#的代码安全高了,带来的就是我们程序员的麻烦。要是VB6,我老早就做好了,只苦于机器上没装VB6,所以只能另寻出路。还好,最好找到一个很好的程序集——mshtml!在项目里面引用程
序集mshtml,它下面有很多HTML标签相关的接口可以使用(估计是COM转过来的)。
因为代码里面获取HTML标签对象用得比较多,所以还获取一下HTML的文档对象,用了IHTMLDocument接口。IHTMLDocument 一共有5个接口,分别为IHTMLDocument、IHTMLDocument2、
IHTMLDocument3、IHTMLDocument4和 IHTMLDocument5。
IHTMLDocument接口没多大用,只有个Script属性,是管理页面脚本用的;IHTMLDocument2接口用起来其实跟C#的 HtmlDocument类(System.Windows.Forms.HtmlDocument)差不多的;
IHTMLDocument3就是跟 vb6里的文档对象差不多的一个接口,推荐大家都用这个,基本上要用的方法都在;IHTMLDocument4接口是跟导航有关的吧;IHTMLDocument5接口几乎都是事件管理的成
员。
先用IHTMLDocument3接口获取页面的文档对象,然后再调用getElementById方法(注意是getElementById方法,不是C#里HtmlDocument对象的GetElementById方法,是不是有JS的那种味道了
?)获取IHTMLElement接口对象,这个对象就包含基本的click方法。这样,我就可以简单地模拟点击按钮的操作了。
觉得C#的WebBrowser对HTML的操作还不是很好,好在还有mshtml程序集作为补充
********************
可以考虑开发Firefox的 extension 来实现对google文档的备份