`
linkyou66
  • 浏览: 226974 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

QTP解决内嵌IE窗体方法2

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

相关推荐

Global site tag (gtag.js) - Google Analytics