请教ihtmlelement 事件的引用空间是什么

请教IHTMLElement 的引用空间是什么
&来源:读书人网&【读书人网():综合教育门户网站】
请问IHTMLElement 的引用空间是什么?为什么我下面这段代码 会提示,IHTMLElement 缺少引用空间。/// summar
请问IHTMLElement 的引用空间是什么?为什么我下面这段代码 会提示,IHTMLElement 缺少引用空间。 &
/// &summary& &
/// 得到元素的位置 &
/// &/summary& &
/// &param name=&elem&&元素&/param& &
/// &returns&&/returns& &
public static Rectangle GetElementRect(IHTMLElement body, IHTMLElement elem) &
int x, y, w, &
x = y = w = h = 0; &
// 计算元素本身的位置 &
IHTMLElement2 elem2 = elem as IHTMLElement2; &
IHTMLRect elemRect = elem2.getBoundingClientRect(); &
x = elemRect. &
y = elemRect. &
w = elemRect.right - elemRect. &
h = elemRect.bottom - elemRect. &
// TODO: 计算顶端htmlElem(docElem)的位置,一般不用计算,其位置应该为(0,0,xx,xx) &
// 计算父亲iframes &
if (body.document != elem.document) &
List&IHTMLDOMNode& frames = new List&IHTMLDOMNode&(); &
_getEleParentFrames(body as IHTMLDOMNode, elem as IHTMLDOMNode, frames); &
foreach (IHTMLDOMNode f in frames) &
IHTMLElement2 frame2 = f as IHTMLElement2; &
IHTMLRect frameRect = frame2.getBoundingClientRect(); &
x += frameRect. &
y += frameRect. &
Rectangle ret = new Rectangle(); &
ret.Width = &
ret.Height = &
}[解决办法]在VS项目中添加Com对象引用:Microsoft Html Object Library &http://longkm./blog/static//【ZT】使用C#开发百度空间验证码自动填写的工具
百度贴吧的验证码是通过js调用的,好像有点ajax的意思,具体没有搞太明白。
当我们的光标焦点在了回复编辑框时,触发了一个onfocus事件,onfocus事件的脚本将验证码的输入框的display属性改为true,之后当我们将光标移动到验证码输入框之后又触发了一个onfocus事件,同时js脚本将验证码现实出来。
看完这个之后整个过程也就基本明了了,我们要想自动识别验证码并填写,首先我们要将现实验证码的图片或得了。
那么或得这个图片之前我们肯定要显示这个图片,也就是必须模拟出以上步骤,光标聚焦的回复编辑框的事件我们不用来处理,因为我们要恢复肯定要填写一定内容,但是下面的步骤就必须要模拟一下了。因为我们是在外部来访问ie浏览器,我们使用mshtml.dl。
首先在你的项目内引用mshtml.dll
在类之前加入下面代码,将com的交互访问设置为true
[System.Visible(true)]
&& �
然后我们定义一个获取图片的方法getimage,getimage通过mshtml的ihtml接口访问ie内的html元素
private Bitmap getImage()
&&&&&&&&&&&
mshtml.IHTMLDocument2 D
&&&&&&&&&&&
mshtml.IHTMLE
&&&&&&&&&&&
mshtml.IHTMLElementC
&&&&&&&&&&&
SHDocVw.ShellWindows shellWindows = new
SHDocVw.ShellWindowsClass();
&&&&&&&&&&&
&&&&&&&&&&&
Bitmap Img=
//便利进程树,从中找到浏览器
&&&&&&&&&&&
foreach (SHDocVw.InternetExplorer ie in shellWindows)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
filename =
Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
&&&&&&&&&&&&&&&
if (filename.Equals(“iexplore”)) //如果进程名为iexplore
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
Doc = ie.Document as mshtml.IHTMLDocument2;
&&&&&&&&&&&&&&&&&&&
mshtml.IHTMLControlE
&&&&&&&&&&&&&&&&&&&
HTMLBody body = (HTMLBody)Doc.
&&&&&&&&&&&&&&&&&&&
mshtml.IHTMLControlRange range =
(IHTMLControlRange)body.createControlRange();
&&&&&&&&&&&&&&&&&&&
if (Doc.domain == “”)
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
Doc.&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
element = all.item(“captcha”, null) as mshtml.IHTMLE
&&&&&&&&&&&&&&&&&&&&&&&
element.click(); .//模拟鼠标点击动作
&&&&&&&&&&&&&&&&&&&&&&
System.Threading.Thread.Sleep(1000); //暂停1秒等ie响应
&&&&&&&&&&&&&&&&&&&&&&&
item = all.item(“captcha_img”, null) as
mshtml.IHTMLControlE
&&&&&&&&&&&&&&&&&&&&&&&
System.Threading.Thread.Sleep(1000);//等待ie读取验证码图片
&&&&&&&&&&&&&&&&&&&&&&&
range.add(item);
&&&&&&&&&&&&&&&&&&&&&&&
range.execCommand(“Copy”, false, null);
&&&&&&&&&&&&&&&&&&&&&&&
Img =new Bitmap(Clipboard.GetImage()); //从剪切板中获取验证码图片
&&&&&&&&&&&&&&&&&&&&&&&
Clipboard.Clear();
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
现在我们已经获取了一个图像文件,接下来我们需要做的就是图像的识别工作了,图像识别这里我们使用谷歌公司的开源库Tesseract
来完成,先介绍一下Tesseract 。
这款名为Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从从此尘封。
数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。
在修复了最重要的数个漏洞后,Google认为Tesseract OCR已经足够稳定,可以重新以开源软件方式发布。
我们使用的是Tesseract的.net版本,大家可以到下载
接下来我们来做一下识别验证码的方法
private void Ocr()
string datapath = System.Environment.CurrentDirectory +
“\\tessdata“; //这个是必须的,我们的字库信息就存储在这里
&&&&&&&&&&
tessnet2.Tesseract ocr = new tessnet2.Tesseract();
&&&&&&&&&&
ocr.Init(datapath, “eng”, false);
&&&&&&&&&&
ocr.OcrDone = new
tessnet2.Tesseract.OcrDoneHandler(Done);//使用一个Handler接管完成识别后的操作
&&&&&&&&&&
ocr.DoOCR(getImage(), Rectangle.Empty);
void Done((List&tessnet2.Word&
str = Words[0]; //这里的str是全局的。
验证码识别出来了,接下来我们把它填入验证码输入框中
public void write()
&&&&&&&&&&
mshtml.IHTMLDocument2 D
&&&&&&&&&&
mshtml.IHTMLE
&&&&&&&&&&
mshtml.IHTMLElementC
&&&&&&&&&&
SHDocVw.ShellWindows shellWindows = new
SHDocVw.ShellWindowsClass();
&&&&&&&&&&
&&&&&&&&&&
Bitmap Img =
&&&&&&&&&&
foreach (SHDocVw.InternetExplorer ie in shellWindows)
&&&&&&&&&&
&&&&&&&&&&&&&&
filename =
Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
&&&&&&&&&&&&&&
if (filename.Equals(“iexplore”))
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
Doc = ie.Document as mshtml.IHTMLDocument2;
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
HTMLBody body = (HTMLBody)Doc.
&&&&&&&&&&&&&&&&&&
mshtml.IHTMLControlRange range =
(IHTMLControlRange)body.createControlRange();
&&&&&&&&&&&&&&&&&&
if (Doc.domain == “”)
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
all = Doc.
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
element= all.item(“captcha”, null) as mshtml.IHTMLE
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
element.setAttribute(“Value”, str, 0);
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&
这个程序基本上也算是完成了,试验中边度的验证码识别率大约在40%左右,也就是说有一半的验证码还是识别不出来,两种可能,一是我没有完全理解Tesseract的使用方法,二是百度的验证码两个字符之间有些交叉的地方,人眼有时都需要仔细分辨才能看清楚,我之前试验用Tesseract识别英文和数字,对于标准的的识别率能达到100%。
好了就说到这里的,如果哪位对Tesseract比较熟悉不妨帮我完善一下这个烂程序。
还有就是ihtml接口也是第一次使用,用的比较糟烂。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。收藏(33个)
作为一个Web应用程序开发者我们想提供给我们的用户具有更强功能的应用程序。我们想为用户通过脚本提供像打印流,本地Socket程序,本地线程这样功能的程序,但是正如我们所知由于任何标准浏览器出于Internet断连结构和安全约束,完成这样的任务十分困难。还好有了ActiveX带来了实现的可能。
Webbrowser、CHTMLView
DOM/MSHTML
& 共2页&&nbsp&&nbsp&&nbsp&在c#中使用HTMLDocument时出现找不到类型或命名空间的错误
[问题点数:10分]
在c#中使用HTMLDocument时出现找不到类型或命名空间的错误
[问题点数:10分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。自己动手写Web自动化测试框架3 - 操纵Web控件发表于: 12:45:38
/ 个人分类:
转贴:生生不息 blog http://www.colblog.net/上面的两次我们介绍了mshtml和SHDocVw的一些用途,以及如何打开并且附加到IE上,实现IE的宏观上的控制。这次我们将会用代码找到我们想要的,然后对控件进行一些操作。首先我们引入一个很好的IE控件:,这个控件可以帮助我们方便的找到我们想要的控件的属性。安装好这个控件之后,我们就可以方便的找到每一个控件的ID,或者其他属性了,如下图IE Developer注意,打开IE Developer Toolbar之后,要点选下面的鼠标按钮,才可以用鼠标来选择我们想要的控件。有了这个控件,我们就不用去查看源文件来找到我们想要的信息了。其他的这里不多说了。接下来我们以百度的三个控件为例,分别告诉大家如何使用ID得到TextBox,如何点击使用ID得到的Button,如何使用子控件缩小范围的方法得到一个HyperLink。首先我们修改上次的代码,把IE指到百度去:Console.WriteLine("Navigating ...");objecto =null;ie.Navigate("",refo,refo,refo,refo);Thread.Sleep(2000);代码我们在&《自己动手写框架2 - 打开和操纵IE》 都讲解过了。只有一点,我们在完成IE的跳转之后,等待了2秒钟的时间,原因是IE的工作是需要时间的,我们在后面的测试部分会讲解如何判断IE已经完成了页面的跳转,在这里为了让大家更好的了解我们本节的主题,只是用了简单的等待。然后我们用IE Developer Tools得到了关键字文本框的ID是kw,所以我们用下面的代码在关键字文本框里面输入了我们想要的关键字://得到一个Text BoxConsole.WriteLine("Inputing Keyword ...");HTMLDocumentdoc = (HTMLDocument)ie.DHTMLInputElementkeyword = (HTMLInputElement)doc.getElementById("kw");keyword.value ="colblog.net";Thread.Sleep(1000);首先我们用ie.Document对象得到了HTMLDocument。目的没什么可说的,因为我们需要HTMLDocument得到下面的控件。而这里之所以使用强制类型转换,是因为Document对象在这里返回一个object的引用,但其实是一个HTMLDocument的实例。所以转换一下就好了,在mshtml里面,这种情况还不少,在上有详细的讲解,使用的时候查一下就好了。然后使用HTMLDocument.getElementById方法,直接从Document里面按照ID取出想要的控件,返回一个IHTMLElement,IHTMLElement是HTMLElement的抽象,所有的HTML的tag都可以是一个IHTMLElement,返回这样的一个引用,我们在知道将会返回什么类型的情况下,可以使用强制类型转换来把对象转成我们想要的引用。就像上面我们所做的,返回的其实是一个Input tag,所以我们要把他转换成HTMLInputElement就好了。下面一句我们直接对这个对象的value进行设置,就可以完成在关键词文本框里面输入我们想要的关键词的动作。接下来我们要点击搜索按钮://得到一个按钮Console.WriteLine("Clicking Submit ...");HTMLInputElementsubmit = (HTMLInputElement)doc.getElementById("sb");submit.click();Thread.Sleep(2000);有了上面文本框的解释,这一段代码就容易多了吧。这里不在赘述。聪明的读者一定会问:我们现在使用ID查询控件,如果我们的控件没有ID怎么办?如果ID是重复的怎么办?上面的两种情况都是完全可能的,而且在实际中几乎占据了大部分的情况。(不过ASP.NET里面的控件倒是都有ID,使用这种方法比较方便。)我们下面的例子就是去点击百度首页右上角的登录超级链接。首先我们分析一下,登录超级链接是放在一个id为u的div里面,而登录超级链接是没有ID的。我们的思路就是先找到这个id为u的div,然后找他的chidren找到我们想要的这个超级链接,下面是源代码://得到一个链接Console.WriteLine("Clicking Login Button ...");IHTMLElementuserPanel = doc.getElementById("u");IHTMLElementCollectionHyperLinks = ((IHTMLElement2)userPanel).getElementsByTagName("a");IHTMLElementlogin = (IHTMLElement)HyperLinks.item(null, 0);login.click();首先我们得到了那个id为u的div,命名为userPanel。这一步和上面没啥区别。下面一个语句我们得到了userPanel的控件的所有tag为a的控件,也就是所有的超级链接。这里有一个小小的需要注意的地方,我们看到这个语句吧IHTMLElement对象强制类型转换成了IHTMLElement2,很有意思,为啥会这样呢?其实IHTMLElement有4个这样的兄弟,他们之间的方法不同,可以互相转换,我们想要的getElementsByTagName在IHTMLElement2下面,所以我们就强制类型转换到IHTMLElement2。这个方法返回一个IHTMLCollection。我们用HyperLinks来储存这个引用。因为userPanel的子控件只有登录超级链接这一个,所以我们直接使用index为0来取道这个对象就好了。IHTMLElementCollection里面的item方法详见,我们只需要把第二个index设置为0,就可以取到第一个子对象。
一周热点空间
最近加入空间
一周讨论热点

我要回帖

更多关于 ihtmlelement click 的文章

 

随机推荐