C#获取网页中某个元素的位置,并模拟点击
我们在开发中,往往要得到网页中某个元素的位置,并且点击它。要模拟一次鼠标点击并不难,只要调用一个API就行了,关键就是怎么样得到这个元素的位置,还有判断是否要滚动滚动条,要滚动多少行能让元素显示出来。当然我们可以动态改变它的CSS,让它在特定的位置显示出来,但这个方法只对比较简单的网页有效。
那我们怎么才能得到网页的位置呢,首先我们来看一张图片
从这里我们可以看到五个offset的属性,这里我们主要利用offsetparent, offsetleft 和offsettop,我们用offsetparent得到元素offset的父元素,再循环,直到BODY为止。
首先我们引用windows\system32\mshtml.ltb这个文件,这样我们才可以得到一些特殊的功能,这个库的功能特别强大,如果自己要做HTML编辑器,可以利用这个库和webBrowser结合,做出来的编辑器功能很强大,就是代码有点不全WEB标准。然后我们要using mshtml;这样以下的代码才能正常运行。
代码:
HTMLDocument doc = webBrowser1.Document.DomDocument as HTMLDocument;
//getElementsByName,getElementById 这里也可以用这两个方法
IHTMLElementCollection els = doc.getElementsByTagName("a");
Point p = new Point();
foreach (IHTMLElement em in els)
{
if ((em.getAttribute("href").ToString() == "javascript:fGoto()") && (em.innerText == "添加附件"))
{
IHTMLElement pem = em;
//元素中间
p.X = em.offsetWidth / 2;
p.Y = em.offsetHeight / 2;
do
{
pem = pem.offsetParent;
p.X += pem.offsetLeft;
p.Y += pem.offsetTop;
} while (pem.tagName.ToLower() != "body");
em.scrollIntoView();//显示元素
break;
}
}
这样我们已经得到了无素的位置,并已经显示在浏览器的可见区域了,似乎我们用API就可以模拟点击了,然而你测试的时候,发现情况并不是这样的。为什么,接着往下看
这个坐标是屏幕坐标,从屏幕的左上角开始,有时你的浏览器并不是最大化的,即使是最大化也不一定窗体中只有webBrowser这个控件,就算只有这个控件,窗体的边框等一系列的,也可能是你的鼠标不移动正确位置上。而且,如果页面有滚动,我们也要得到滚动去的那一部分。
如果要点击则必须要以下代码:
//被卷去的部分
int sl, st;
sl = int.Parse(doc.documentElement.getAttribute("ScrollLeft").ToString());
st = int.Parse(doc.documentElement.getAttribute("ScrollTop").ToString());
//加上窗体的位置及控件的位置及窗体边框,30和8是窗体边框
p.X += em.offsetLeft + this.Left + webBrowser1.Left - sl + 8;
p.Y += em.offsetTop + this.Top + webBrowser1.Top + 30 - st;
//定位鼠标
Cursor.Position = p;
//单击
mouse_event(6, 0, 0, 0, this.Handle);
这样我们就可以点击到我们需要点击的元素了。关于mouse_event这个API请去看MSDN我网上的教程。Cursor.Position这个鼠标定位也可以用API函数SetCursorPos,但C#有这个东西就不必去调用了。
C#获取网页中某个元素的位置,并模拟点击的更多相关文章
- JS获取网页中HTML元素的几种方法分析
getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getEle ...
- 【学习】如何用jQuery获取iframe中的元素
(我的博客网站中的原文:http://www.xiaoxianworld.com/archives/292,欢迎遇到的小伙伴常来瞅瞅,给点评论和建议,有错误和不足,也请指出.) 说实在的,以前真的很少 ...
- 使用selenium的方式获取网页中图片的链接和网页的链接,来判断是否是死链(二)
上一篇使用Java正则表达式来判断和获取图片的链接以及跳转的网址,这篇使用selenium的自带的API(getAttribute)来获取网页中指定的内容 实现内容:获取下面所有图片的链接地址以及跳转 ...
- Js/Jquery获取iframe中的元素
转载: Js/Jquery获取iframe中的元素 - - ITeye技术网站http://java-my-life.iteye.com/blog/1275205 在web开发中,经常会用到ifram ...
- js 获取iframe中的元素
今天要修改编辑器插件中的元素遇到的问题 jquery 在父窗口中获取iframe中的元素 1.Js代码 格式:$("#iframe的ID").contents().find(&qu ...
- php获取网页中图片并保存到本地
php获取网页中图片并保存到本地的代码,将网页中图片保存本地文件夹: save_img("http://www.jbxue.com" ?>
- 获取iframe中的元素
父窗口中获取iframe中的元素 var ifr = document.getElementById('suggustion').contentWindow.document.body; 在ifram ...
- Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法
在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素 1. 格式:window ...
- php获取网页中图片并保存到本地的代码
php获取网页中图片并保存到本地的代码,将网页中图片保存本地文件夹: <?php /** * 获取网页中图片,并保存至本地 * by www.jbxue.com */ header(" ...
随机推荐
- define的用法
define的用法小结 define的用法只是一种纯粹的替换功能,宏定义的替换是预处理器处理的替换. 一:简单的宏定义用法 格式:#define 标识符 替换内容 替换的内容可以是数字,字符,字符串, ...
- redis常见性能问题和解决方案?
Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照. Master AOF持久化, ...
- 【软件工程-Teamwork 3】团队角色分配和团队贡献分分配规则
Part 1 团队角色分配 1.人员分配概要: Project Manager:1名 / Developer:4名 / Test: 1名 2.具体人员分配及职责: Project Manager(PM ...
- asp.net 中插入数据到access
这样报语法错误: insert into Menu_wx(userid,menutype,MenuID,menuname,MenuTitle,Url,Key,OrderValue,State) val ...
- 1562: [NOI2009]变换序列 - BZOJ
Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤ ...
- Linux/Ubuntu常用快捷键
问题描述: Linux/Ubuntu常用快捷键 问题解决: +++++++++++++++++++ 全局系统 +++++++++++++++++++++ Alt + F1:相当于w ...
- [设计模式] 7 适配器模式 adapter
在 Adapter 模式的结构图中可以看到,类模式的 Adapter 采用继承的方式复用 Adaptee的接口,而在对象模式的 Adapter 中我们则采用组合的方式实现 Adaptee 的复用 类模 ...
- OWASP
开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)是一个组织,它提供有关计算机和互联网应用程序的公正.实际.有成本效益的信息.其目的 ...
- springMVC 简单事例
本帖最后由 悲观主义者一枚 于 2015-1-31 17:55 编辑 使用SpringMvc开发Android WebService入门教程1.首先大家先创建一个JavaWeb项目2.然后加入Spri ...
- Sql注入中连接字符串常用函数
在select数据时,我们往往需要将数据进行连接后进行回显.很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数.在sqli中,常见的字符串连接函数有concat(),group_ ...