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(" ...
随机推荐
- iTween基础之Value(数值过度)
一.基础介绍:二.基础属性 原文地址:http://blog.csdn.net/dingkun520wy/article/details/50550527 一.基础介绍 Value有一个函数 Valu ...
- Financial Management
Financial Management 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 Larry graduated this year and finally ...
- Sqlyog增加试用期
win+r->输入regedit->进入注册表 在计算机->HKEY_CURRENT_USER->Software->{906D6D9F-AB51-429F……}中删除I ...
- oracle 常用SQL语法手册
Select 用途: 从指定表中取出指定的列的数据 语法: SELECT column_name(s) FROM table_name 解释: 从数据库中选取资料列,并允许从一或多个资料表中,选取一或 ...
- 2006: [NOI2010]超级钢琴 - BZOJ
Description小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为 ...
- dragsort拖动插件的使用
<!DOCTYPE html><html><head> <title>DragSort Example</title> <meta c ...
- 关于在js中使用csstext的问题
会将前边所设置的css属性全部清空,慎用!
- **【ci框架】PHP的CI框架集成Smarty的最佳方式
因为CI自带的模板功能不是很方便,所以大家普遍采用集成Smarty的方式来弥补CI这方面的不足. 本人在网上看了不少CI集成Smarty的教程,包括咱们CI论坛里面的一个精华帖子 http://cod ...
- Git PHP提交
做了个小的DEMO,可以查看: https://github.com/feixiang/webgit.git 这几天一直在郁闷的事情. Git在shell里面执行得好好的,apache运行用户也改成了 ...
- 彷徨中的成长-记一个文科生的IT成长过程
纠结了许久,要不要写这篇文章,然而最终还是写了.就权当总结与呻吟吧..当然,呻吟最开始还是发在自己的站点的,忍不住手贱,还是想发博客园. 1 剧透 人算不如天算:时隔多年,我竟然搞起了前端. 2 发端 ...