注:原文最早是发表在www.automationqa.com上面的,后来因为网站被黑而文章内容消失了,希望csdn别被黑了。
关于转载:本文为原创文章,欢迎转载,但转载需要标注出处以及保证内容的完整性,请理解写作的寂莫和苦处。
关于版权:本文不得应用于以赢利为目的的任何场景,否则本人保留相应的权利。
不知道您昨晚学会清蒸豆豉鱼这道菜,如果你学会了,不仅证明你非常的有口福,同时也说明了你是一个爱动手有实干精神的人,更说明了你肯定是一个能学会使用QTP的人,因为做菜是生活必需的,而QTP不是。今晚就不谈做菜了,还是说说刚看的电影吧!老婆说《李密的猜想》中的王宝强被骗的好惨。是啊,每年世界上又有多少个《李密的猜想》中的王宝强呢?我可亲可爱的农民同胞们又有多少每天为了生存,虽然悲屈但仍坚强地《活着》呢!做为一个所谓农民或农民工的儿子,我想起了过去,尤其是那双漏水的鞋,坑脏的厨房,每天14个小时工作,还有我那些在小面馆中工作的阿姨们,还有资本家们给予700百元的现实。社会是如此的疯狂,人生是如此的无耐,我期待有一个圣人,伟大的圣人啊,带领我们进入真实的乌托邦!
最近废话和过去想做作家的梦一样多,一样的天真,真是糟糕,还是开始今天的课题吧!使用QTP也有一段时间了,每当我被QTP折磨得够呛时,我就常常在想,我能不能自己写了一个类似的程序呢,抛弃它使用我的原理,于是狂揽群书而快速地观之后惊奇的发现也许QTP Web的实现原理也大抵如此。请注意,本文完全是一种猜想,是否正确,留给上帝判明吧!
好吧,就让我们对QTP的内部实现细节进行猜想吧。
我们都知道,IE也罢FireFox也罢,他们都是基于HTML前端代码访问服务器,服务器处理后再次返回到前端页面的。不知大家注意过没有,使用FireFox时,选中某个区域后,可以查看这个区域内的源代码,提交数据后,再查看时,源代码又重新下载了一部分。使用过类似于firebug的人应该知道,当我们将firebug中的小箭头指向页面中的某个元素然后点击的时候,firebug就会将这个区域的相关代码给显示出来(这是如何做到的,目前还不清楚)。
于是,我们可以这样猜测QTP web的内部实现细则,开启录制时,程序即开始监听,当我们点击某个页面元素时,QTP就像firebug一样,下载了这个区域的前端代码,然后根据这段代码的标签按照QTP的设定方式进行分类并可能给它分配了一个编号,而这个标签中的其它信息,就按照标签所有的常用属性名称将它存储在仓库对象之中,至于你使用的方法就可能是监听你的键盘操作或者鼠标操作,然后按照你指定区域的标签的类型,记录方法,至于此标签所处的Browser或Page(Frame)或WebTable则根据HTML DOM结构可以分析出来。
如果你赞同上面的猜想,也许就可以理解,为什么QTP录制的时候,输入框是必需进行更变输入,否则无法录制的原因。
如果你赞同上面的猜想,也许我们就可以解释,为什么QTP录制日期控件时,总是回放失败,而认为是一个WebTable对象,因为它认为了日期控件是属于当前Page的(Frame实际上是一个Page),而实在不然(具体以后会讲到怎么处理日期控件,以及怎么实现完全模拟人工操作的日期控件的问题)。
如果你赞同上面的猜想的话,也许我们可以建立一个表,使HTML的标签与QTP的Web对象建立起对应关系。
Html 标签 |
QTP 对象 |
<html> |
Page |
<a /> |
Link |
<Link/> |
Link |
<area /> |
WebArea |
<button /> |
Button |
<div /> |
WebElement |
<form /> |
WebElement |
<frame /> |
Frame |
<frameset /> |
Frame |
<iframe /> |
Frame |
<img /> |
Image |
<input type=button/> |
WebButton |
<input type=checkbox/> |
WebCheckBox |
<input type=file/> |
WebFile |
<input type=image/> |
Image |
<input type=password/> |
WebEdit |
<input type=radio/> |
WebRadioGroup |
<input type=reset/> |
Button |
<input type=submit/> |
Button |
<input type=text/> |
WebEdit |
<label /> |
WebElement |
<option /> |
WebElement |
<p /> |
WebElement |
<select /> |
WebList |
<span /> |
WebElement |
<table /> |
WebTable |
<tbody /> |
WebElement |
<td /> |
WebElement |
<textarea /> |
WebEdit |
<tr /> |
WebElement |
如果你赞同上表的猜想的话,我们可以从上面的表中得知QTP把不少对象都认成了WebElement,那么也许我们可以在某些时候这样使用Browser().Page().WebElement(这里是一个层).WebEdit().set XX,从而解决QTP某些时候的对象认识的层次问题。曾经我在QTP提供的帮助文档里看到说WebElement可以供所有Web对象使用,当时我还认真的去调试了一下,发现运行后现象如下(当然也可能是我理解错误)。
所以如果说,WebElement对象如表中对应关系的话,我还相信,但是如参考文档所述,就不敢苟同了。
如果你赞同上表的猜想的话,也许我们就可以解释为什么有时某个对象页面中明明没有,而程序判断出的结果却用。这时,你只需要到页面源代码中寻找,往往来说不是这个对象被隐藏了,就是边框为0。
如果你赞同上面的猜想的话,也许我们就可以理解,为什么有时候用描述性编程时,在回放过程中,QTP报对象重复的提示语。因为它们在前端代码中的源码是一样的。
所以,如果你下次遇到QTP回放时报错的话,不妨试一试看看他的源代码,分析分析也许问题就在不轻意间解决了。当然,如果你不认识HTML代码或者不会使用firebug等类似软件,我上面的话全当白说。
文青山
2011-4-1