我们在开发中,往往要得到网页中某个元素的位置,并且点击它。要模拟一次鼠标点击并不难,只要调用一个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#获取网页中某个元素的位置,并模拟点击的更多相关文章

  1. JS获取网页中HTML元素的几种方法分析

    getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getEle ...

  2. 【学习】如何用jQuery获取iframe中的元素

    (我的博客网站中的原文:http://www.xiaoxianworld.com/archives/292,欢迎遇到的小伙伴常来瞅瞅,给点评论和建议,有错误和不足,也请指出.) 说实在的,以前真的很少 ...

  3. 使用selenium的方式获取网页中图片的链接和网页的链接,来判断是否是死链(二)

    上一篇使用Java正则表达式来判断和获取图片的链接以及跳转的网址,这篇使用selenium的自带的API(getAttribute)来获取网页中指定的内容 实现内容:获取下面所有图片的链接地址以及跳转 ...

  4. Js/Jquery获取iframe中的元素

    转载: Js/Jquery获取iframe中的元素 - - ITeye技术网站http://java-my-life.iteye.com/blog/1275205 在web开发中,经常会用到ifram ...

  5. js 获取iframe中的元素

    今天要修改编辑器插件中的元素遇到的问题 jquery 在父窗口中获取iframe中的元素 1.Js代码 格式:$("#iframe的ID").contents().find(&qu ...

  6. php获取网页中图片并保存到本地

    php获取网页中图片并保存到本地的代码,将网页中图片保存本地文件夹: save_img("http://www.jbxue.com" ?>

  7. 获取iframe中的元素

    父窗口中获取iframe中的元素 var ifr = document.getElementById('suggustion').contentWindow.document.body; 在ifram ...

  8. Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法

    在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素  1. 格式:window ...

  9. php获取网页中图片并保存到本地的代码

    php获取网页中图片并保存到本地的代码,将网页中图片保存本地文件夹: <?php /** * 获取网页中图片,并保存至本地 * by www.jbxue.com */ header(" ...

随机推荐

  1. WPF解析Fnt字体

    偶遇需要再 WPF中加载Fnt字体,此做... using System; using System.Collections.Generic; using System.Drawing; using ...

  2. win8安装matlab7.0

    win8和win7下安装matlab7.0要注意许多地方,其实安装最新版一般都是没有问题的. 不过最新版太大,校园网下载太难,所以还是用7.0 基本上在百度经验上已经包括了大部分的注意事项了,可以参考 ...

  3. 怎么查看其它apk里面的布局代码及资源

    今天才看到的好方法, 将你要的apk文件的后缀名改为zip,解压就可以了. --------------------------------- 提示:有时候系统会自动隐藏你的后缀名的,这时候就需要你将 ...

  4. ExtJS4.2学习(21)动态菜单与表格数据展示操作总结篇2

    运行效果: 此文介绍了根据操作左侧菜单在右面板展示相应内容. 一.主页 先看一下跳转主页的方式:由在webapp根目录下的index.jsp跳转至demo的index.jsp 下面是demo的inde ...

  5. SQL SERVER字符串函数

    本篇文章还是学习<程序员的SQL金典>内容的记录,此次将讲解的是SQL SERVER的字符串函数. 其实数据库跟程序语言库一样,都会集成很多可以使用的API.这些API,如果你熟悉的话,将 ...

  6. .Net 使用 Oracle 提供组件访问数据库

    向导式安装客户端组件 32位下载: http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html   批处理式安装客户端组件 ...

  7. OWASP

    开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)是一个组织,它提供有关计算机和互联网应用程序的公正.实际.有成本效益的信息.其目的 ...

  8. 【设计模式六大原则3】依赖倒置原则(Dependence Inversion Principle)

      定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类 ...

  9. Sublime Text 2 快捷键 插件配置

    一.前言之前 从设计到前端,有过一段时间是懵懵懂懂的状态,缺乏对整个职业更加深入的了解.后来混迹于各个前端大牛的博客,在各个QQ群里聆听各路大神的经验之谈,坚定了前端之路的信心.一直收藏各类精华的帖子 ...

  10. WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )

    WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...