51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 4292|回复: 2
打印 上一主题 下一主题

[原创] 使用C#写了个监听IE操作的,但是有些问题解决不了

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2012-10-21 01:45:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我不知道问谁好,好多东西,找来找去,还不如问一下,也许得到的答复快一点。原本是希望研究QTP网页捕捉原理才写的,不过好多问题不能解决。比如全局鼠标钩子,没弄成功,IFrame监听不了

程序是基于委托了。类似这样子,获得Ie浏览器对象,然后对Ie的IHTMLDocument2进行委托监听

很小很小部分代码
  1. #region IHTMLDocument2委托事件
  2.         public void ApplyHanderEvent()
  3.         {
  4.             HTMLDocumentEvents2_Event DocEvents = _iDocment as HTMLDocumentEvents2_Event;
  5.             //网页元素失去焦点事件委托
  6.             DocEvents.ondeactivate+=new HTMLDocumentEvents2_ondeactivateEventHandler(Ondeactivate);

  7.            //网页元素获得焦点事件委托
  8.             DocEvents.onactivate+=new HTMLDocumentEvents2_onactivateEventHandler(OnActivate);
  9.             //单击添加委托,OnClick实现处理方法
  10.             //单击事件,暂时不处理
  11.             //DocEvents.onclick += new HTMLDocumentEvents2_onclickEventHandler(OnClick);
  12.         }
  13.       
  14.         private void Ondeactivate(IHTMLEventObj pEvtObj)
  15.         {
  16.             //元素判断对象
  17.             new Record_UnitJudge(pEvtObj.srcElement, _iOutputContainer, this.i);
  18.         }
  19.         //很有用,就用这个来判断上一个获得焦点的元素
  20.         private void OnActivate(IHTMLEventObj pEvtObj)
  21.         {
  22.             //元素判断对象
  23.             new Record_UnitJudge(pEvtObj.srcElement, _iOutputContainer, this.i);
  24.         }
复制代码
问题1,监听不到网页上的IFrame对象的操作
问题2,回放的时候,也获取不到IFrame对象里面的网页元素,从而对IFrame里面的元素赋值啥的都不行
问题3,C#的全局鼠标钩子能成功,但是鼠标事件委托函数不会被运行,也就获取不到鼠标点击事件,,,

也讲一下目前的进度:
1,Ie操作后,获取输入框赋值,回放赋值
2,Ie操作后,获取按钮,超链接,计算该类元素的坐标,使用mouse_event来模拟单击按钮操作,没有对象库,只是简单的将控件的name和id作为判断值

只是最简单的东西,弹窗口操作记录什么的预计是要使用鼠标钩子了,但用C#写的鼠标钩子有问题,使用C++写的又不会,写出来的C#调用又没有反应。。。。

需要修改,Class>ConstClass的IEFRAME_TOP = 140;   
140是我的Ie浏览器菜单栏的高度,这个需要自己调整
如果出现QueryService xxx的错误
需要对象SHDocVw和Microsoft.mshtml重新引用

程序是半成品,不具体直接使用,VS2010下开发的

希望有研究的同学告诉下如何获取IFrame对象,从而得到它的IHTMLDocument2监听委托,我也不知道Ie什么事件下,该IFrame能够调用
因为通过Ie的IHTMLDocument2获取的IFrame,检查它的事件都是没有实现的。NotImplementException,不过想想也是,IFrame一般是指向另外一个页面的。没有打开该页面,怎么会有事件了呢。获取不到IFrame事件委托啊。悲剧。
Ie弹出提示框,是会触发Ie的什么事件的么。这个我也不知道。

如果没有答案,我也不会再发类似的帖子了,就纯当兴趣的研究下算了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2012-10-23 22:41:05 | 只看该作者
问题已经解决,原来应了那句话,远在天边,近在眼前

附上解决代码:
  1. IHTMLElementCollection iframes = (_iDocment as HTMLDocument).getElementsByTagName("iframe");  //获取IFrame元素
  2. IHTMLElement iframe =iframes.item(1);      //随便写的,主要是说明一下

  3. HTMLFrameElement frm = (HTMLFrameElement)iframe;     //转换1            
  4. IHTMLDocument2 frameDoc = (IHTMLDocument2)((IWebBrowser2)frm).Document;     //转换2,搞定,能获取的到Iframe的IHTMLDocument2对象了,然后就是和普通的差不多了,不过iframe元素的坐标获取不一样了

  5. ////DispHTMLDocument dispDoc = (DispHTMLDocument)((IWebBrowser2)frm).Document;因为之前是转换成这个DispHTMLDocument 去拿去委托对象,所以不得而终,其实代码就躺在那了,只是自己不会想而已:funk:
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2012-10-24 10:02:03 | 只看该作者
很不错,支持下~
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-5-12 03:03 , Processed in 0.092297 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表