QTP解决内嵌IE窗体方法2

简介:
 之前说过旺旺内嵌IE取得聊天记录的方法一,但是在实际试验中这种方法不稳定,因为有些机器上无法 辨识到该控件是PAGE(原因未明,可能和IE版本或其他环境因素有关系)。
       但是在客户端性能测试中需要了解加载聊天记录的时间,之前用过粗略的方法QTP自带的方法GetVisibleText,结果在测试过程中发现有时候肉眼都已经看见聊天记录了,但是脚本还是停留在GetVisibleText的语句行。所以必然是在获取内容上花了很多时间。而且该方法取值只能取得界面上看得见的聊天记录。那怎么才能取得完整的聊天记录而花费较少的时间呢。之前看过曾一讯演示的产品中可以抓取聊天记录,于是就像或者可以借取它的代码封装成一个dll来使用。顺着这个思路我开始了具体的工作。
         首先,了解一讯的代码发现是用IHTMLDocument2 这个东东,将测试对象的句柄传入转化成IHTMLDocument2接口,就可以对这个接口做一些事情了,因为这个接口提供了较丰富的方法。借取代码C#如下:
public String findWWIE(int iihwdl)
{
IntPtr wbHandle = new IntPtr(iihwdl);
StringBuilder sb1 = new StringBuilder();
try
{
System.Object domObject = new System.Object();
int tempInt = 0;
System.Guid guidIEDocument2 = new Guid(); //应该是IHTMLDocument2的接口id
int WM_Html_GETOBJECT = WinApiT.RegisterWindowMessage("WM_Html_GETOBJECT");
int W = WinApiT.SendMessage(wbHandle, WM_Html_GETOBJECT, 0, ref tempInt);
int lreturn = WinApiT.ObjectFromLresult(W, ref guidIEDocument2, 0, ref domObject);
mshtml.IHTMLDocument2 myDoc = (mshtml.IHTMLDocument2)domObject;
int heightsize = (int)(myDoc as HTMLDocumentClass).documentElement.getAttribute("scrollHeight", 0);
int widthsize = (int)(myDoc as HTMLDocumentClass).documentElement.getAttribute("scrollWidth", 0);
IEnumerable ieab =
myDoc.all.OfType();//loginId
myDoc.forms.OfType();
sb1.Append(myDoc.body.outerText);
//LogTextSet(myDoc.body.outerText, true);
for (int i = 0; i < ieab.Count(); i++)
{
sb1.Append(ieab.ElementAt(i).name + "\r\n");
//LogTextSet(ieab.ElementAt(i).name + "\r\n", false);
}
}
catch (Exception ex)
{
//sb1.Append("Fatal Error:\r\n" + ex.Message);
}
return sb1.ToString();
}
        很简单吧,这里做了点小小的处理如让传入的为int对象;这样和QTP就无缝结合了,在这过程中还用Sky++验证了一下,结果犯了个小错误sky++用的是16进制,而c#用的是十进制,当然QTP中就没有这样的问题了。
        当然在编写上述代码的时候需要引入Microsoft.mshtml.dll。那么就有后面的问题了。当我在测试环境(10.1.151.32)中调试通过的时候,我就把他换到实际的开发环境中测试。结果报Microsoft.mshtml.dll没有找到,怎么办呢。当然Microsoft.mshtml.dll了,那么如何注册.net dll呢。网上说用regasm.exe,命令 regasm Microsoft.mshtml.dll
于是我用了,结果没有效果。还报错,怎么办呢打开assembly,直接把dll拖进去。搞定了,至于原因没有时间考究。反正不是解决问题的重点。
        接下来,我要验证一下这种方法和原来GetVisibleText哪个耗费的时间短点。具体看代码吧:
Set obj1 = DotNetFactory.CreateInstance("TaijiData.commonfunc","C:\TaijiData.dll")
Set obj3 = DotNetFactory.CreateInstance("QTPHELP.IEHelp","C:\QTPHELP.dll")
For i = 0 to 5
theDate1 = obj1.GetNow
obj3.findWWIE(Window("cctv19790318").WinObject("Internet Explorer_Server").GetROProperty("hwnd"))
'Window("cctv19790318").WinObject("Internet Explorer_Server").GetVisibleText
theDate2 = obj1.GetNow
print cstr(theDate2 - theDate1)
Next
结果证明我的猜想,用GetVisibleText用时大概1100毫秒
用新的方法用时100毫秒
顺便记录一下,在测试过程中还知道了GetROProperty和GetTOProperty的区别(大家自己看帮助吧,没有那么便宜的事情)。
 


本文转自elbertchen 51CTO博客,原文链接:http://blog.51cto.com/linkyou/282594,如需转载请自行联系原作者
相关文章
|
6月前
|
Web App开发 前端开发 JavaScript
|
1月前
|
存储 机器人
在阿里云RPA中,你可以通过以下步骤来更改默认唤醒IE浏览器的地址
【2月更文挑战第28天】在阿里云RPA中,你可以通过以下步骤来更改默认唤醒IE浏览器的地址
19 1
|
7月前
|
Web App开发 XML 编解码
IE浏览器下载文件中文文件名乱码问题解决
IE浏览器下载文件中文文件名乱码问题解决
82 0
|
4月前
|
Web App开发 JavaScript 前端开发
JavaScript在IE和标准浏览器下的兼容性处理
JavaScript在IE和标准浏览器下的兼容性处理
39 0
|
5月前
|
前端开发
border-radius 兼容 IE8浏览器
border-radius 兼容 IE8浏览器
39 1
|
5月前
|
Web App开发 移动开发 安全
IE浏览器,和Edge浏览器
IE浏览器,和Edge浏览器
|
5月前
|
JavaScript
兼容IE浏览器
兼容IE浏览器
31 0
|
7月前
|
JSON JavaScript 前端开发
基于FlashWavRecorder实现IE11浏览器录音后用科大讯飞转文字
基于FlashWavRecorder实现IE11浏览器录音后用科大讯飞转文字
58 0
|
7月前
|
编解码 网络协议 开发工具
IE浏览器下如何低延迟播放RTSP或RTMP流
首先,虽然本文是介绍IE浏览器下OCX控件播放RTSP或RTMP,但这种方式并不推荐,毕竟它只能用于IE浏览器环境下,局限太大,而且随着微软IE浏览器的更新,不确定后续支持情况。当然,话说回来,如果是在特定的使用场景下,只需要某些版本IE浏览器支持,但对延迟和稳定性要求非常高,OCX控件方式也不失为一个好的选择。
|
7月前
|
编解码 网络协议 开发工具
如何在IE浏览器播放RTSP或RTMP流
好多开发者一直苦恼于如何在IE浏览器环境下,构建低延迟的RTSP或RTMP播放,对于RTSP流来说,好多公司通常的做法是把RTSP转RTMP,然后分发到RTMP服务器,然后服务器转http-flv出来,浏览器直接播放http-flv流,亦或通过flash控件直接播放RTMP流,还有就是,转hls流出来,缺点是hls流延迟更大。
279 0