51Testing软件测试论坛
标题:
使用C#写了个监听IE操作的,但是有些问题解决不了
[打印本页]
作者:
lgh75560
时间:
2012-10-21 01:45
标题:
使用C#写了个监听IE操作的,但是有些问题解决不了
我不知道问谁好,好多东西,找来找去,还不如问一下,也许得到的答复快一点。原本是希望研究QTP网页捕捉原理才写的,不过好多问题不能解决。比如全局鼠标钩子,没弄成功,IFrame监听不了
程序是基于委托了。类似这样子,获得Ie浏览器对象,然后对Ie的IHTMLDocument2进行委托监听
很小很小部分代码
#region IHTMLDocument2委托事件
public void ApplyHanderEvent()
{
HTMLDocumentEvents2_Event DocEvents = _iDocment as HTMLDocumentEvents2_Event;
//网页元素失去焦点事件委托
DocEvents.ondeactivate+=new HTMLDocumentEvents2_ondeactivateEventHandler(Ondeactivate);
//网页元素获得焦点事件委托
DocEvents.onactivate+=new HTMLDocumentEvents2_onactivateEventHandler(OnActivate);
//单击添加委托,OnClick实现处理方法
//单击事件,暂时不处理
//DocEvents.onclick += new HTMLDocumentEvents2_onclickEventHandler(OnClick);
}
private void Ondeactivate(IHTMLEventObj pEvtObj)
{
//元素判断对象
new Record_UnitJudge(pEvtObj.srcElement, _iOutputContainer, this.i);
}
//很有用,就用这个来判断上一个获得焦点的元素
private void OnActivate(IHTMLEventObj pEvtObj)
{
//元素判断对象
new Record_UnitJudge(pEvtObj.srcElement, _iOutputContainer, this.i);
}
复制代码
问题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的什么事件的么。这个我也不知道。
如果没有答案,我也不会再发类似的帖子了,就纯当兴趣的研究下算了。
[attach]81818[/attach]
作者:
lgh75560
时间:
2012-10-23 22:41
问题已经解决,原来应了那句话,远在天边,近在眼前
附上解决代码:
IHTMLElementCollection iframes = (_iDocment as HTMLDocument).getElementsByTagName("iframe"); //获取IFrame元素
IHTMLElement iframe =iframes.item(1); //随便写的,主要是说明一下
HTMLFrameElement frm = (HTMLFrameElement)iframe; //转换1
IHTMLDocument2 frameDoc = (IHTMLDocument2)((IWebBrowser2)frm).Document; //转换2,搞定,能获取的到Iframe的IHTMLDocument2对象了,然后就是和普通的差不多了,不过iframe元素的坐标获取不一样了
////DispHTMLDocument dispDoc = (DispHTMLDocument)((IWebBrowser2)frm).Document;因为之前是转换成这个DispHTMLDocument 去拿去委托对象,所以不得而终,其实代码就躺在那了,只是自己不会想而已:funk:
复制代码
[attach]81857[/attach]
作者:
lantianwei
时间:
2012-10-24 10:02
很不错,支持下~
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2