【C#】通过遍历IFrame访问页面元素
2015-09-01 22:58
417 查看
最近在做一个小项目,期间需要用到C#去操作IE页面中的元素,实现自动填写表单并且提交的功能,想这网上关于这方面的东西肯定很多,于是开始在网上找资料。
在逆心的博客上找到些东西对自己帮助很大,原文链接:http://www.cnblogs.com/kissdodog/p/3725774.html
1.首先添加必须的两个控件的引用
Microsoft Internet Controls
Microsoft HTML Object Library
2.遍历所有的IE窗口
3.通过DOM操作IE页面
4.通操作IFrame中的元素
很不巧的是原作者也没有实现直接对IFrame中元素的操作,在网上找了很久也没有找到相关的文章,没有办法,只能自己搞了。
分析网页结构,是多层IFrame相互嵌套的复杂结构,并且上层是无法获取子层的元素的,真是麻烦~
后来转念一想,既然是多层嵌套,那不正好可以用递归来实现么,遍历所有的IFrame应该可行,暴力美学~
最后打包程序的时候需要这两个库对应的Dll放在exe同一个目录下面,否则很可能因为dll版本的不同造成不报错的失败。
在逆心的博客上找到些东西对自己帮助很大,原文链接:http://www.cnblogs.com/kissdodog/p/3725774.html
1.首先添加必须的两个控件的引用
Microsoft Internet Controls
Microsoft HTML Object Library
2.遍历所有的IE窗口
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass(); foreach (InternetExplorer Browser in shellWindows) { if (Browser.Document is HTMLDocument && Browser.LocationURL.Contains("ra207.com")) { mshtml.IHTMLDocument2 doc2 = (mshtml.IHTMLDocument2)Browser.Document; //... } }
3.通过DOM操作IE页面
mshtml.IHTMLElementCollection inputs = (mshtml.IHTMLElementCollection)doc2.all.tags("INPUT"); mshtml.HTMLInputElement input1 = (mshtml.HTMLInputElement)inputs.item("kw1", 0); input1.value = "test"; mshtml.IHTMLElement element2 = (mshtml.IHTMLElement)inputs.item("su1", 0); element2.click();
4.通操作IFrame中的元素
很不巧的是原作者也没有实现直接对IFrame中元素的操作,在网上找了很久也没有找到相关的文章,没有办法,只能自己搞了。
分析网页结构,是多层IFrame相互嵌套的复杂结构,并且上层是无法获取子层的元素的,真是麻烦~
后来转念一想,既然是多层嵌套,那不正好可以用递归来实现么,遍历所有的IFrame应该可行,暴力美学~
//遍历IFrame public static bool FramesRecursion(ref IHTMLWindow2 frame) { IHTMLDocument2 frameDoc = frame.document; if (null == frameDoc) return false; if (null == frameDoc.body.innerHTML) return false; if (frameDoc.body.innerHTML.Contains("确定交易")) //找到目标 { FindAndClickTheButton(ref frame); //操作目标 return true; } //遍历该IFrame包含的所有子IFrame IHTMLFramesCollection2 frames = (IHTMLFramesCollection2)frameDoc.frames; int len = frames.length; if (len <= 0) return false; object i = 0; object olen = len; while ((int)i < (int)olen) { IHTMLWindow2 frame2 = frames.item(ref i) as IHTMLWindow2; if (FramesRecursion(ref frame2)) return true; i = (object)((int)i + 1); } return false; }
最后打包程序的时候需要这两个库对应的Dll放在exe同一个目录下面,否则很可能因为dll版本的不同造成不报错的失败。
相关文章推荐
- C#中的线程(二) 线程同步基础
- C#中的线程(二) 线程同步基础
- C# L该系统的应用istView简单的图像浏览器
- C#计算一段程序的运行时间
- C# 实例一 文件切合和合并
- C#中static关键字的作用(转)
- C# 之 无法嵌入互操作类型(Word 或 Excel 操作)
- C#------foreach遍历字典
- c#中从string到string[]
- C#------火星文翻译器
- C#中string、byte转换
- c#日志
- CSharpGL(2)设计和使用场景元素及常用接口
- C#List<long>与String(Linq)
- C#多线程的同步与通信
- C#依据word模版动态生成文档
- C# 操作注册安装、开启、停止、卸载服务
- C#------泛型集合、字典
- C#.NET实现基于Lumisoft的邮件收发功能
- C# virtual和override