QTP对象识别原理

上一篇 / 下一篇  2015-01-06 22:03:22 / 个人分类:QTP

 QTP对象识别原理,在讨论这个话题之前,先让我们把思绪抽回到1800年前。
    这里是烽火连天的三国时代,曹操与马超正大战于潼关。乱军丛中,曹操望风而逃,马超在后面大喊:“穿红袍的是曹操!”,曹操听到后立马脱掉红袍。随后又听到大喊:“长胡子的是曹操!”,曹操大惊,又拿刀割掉了自己的胡子。马超知道后,大喊:“短胡子的是曹操!”……
    为什么要先说这么一段故事呢,其实这段故事的某些地方与QTP中对象识别原理非常相似。

TO与RO,记忆与现实
        首先,我们知道,QTP中的对象有两个概念,一个是Test Object (TO)即对象库对象,另一个是Run-time Object(RO)即运行时对象,并且有四个非常重要的和TO、RO相关的函数:
        GetTOProperty() —— 获取对象库对象的某个属性值
        GetTOProperties() ——获取对象库对象的所有属性值
        SetTOProperty()  —— 设置对象库对象的某个属性值
        GetROProperty() —— 获取运行时对象的某个属性值

这些看起来好像很抽象,但其实QTP去识别对象和我们人脑去识别各种事物有着异曲同工之妙。 通常情况下,我们去识别一个人,脑海中首先会有一些基本的印象,比如,性别、外貌、身高、声音等等,QTP的对象库对象(Test Object)就好比是人的大脑中的记忆,性别、外貌、身高等因素就是这个对象的属性。知道了对象库对象的概念后,运行时对象其实也很好理解了,就是在运行时的实际对象,好比是一个真实的人,而不是记忆中的那个人,因为这两者毕竟还是有一定区别的。
       有了对象的这些属性就能够识别出这个对象了吗?答案是否定的。因为这些属性有些不是强制属性,是会临时变化的。就像文章刚开始时的那段故事中一样,第一次,马超率领的西凉兵,对曹操的印象是“穿着红袍”,士兵们带着“战袍颜色 = 红色”这个很容易变化的辅助属性去识别曹操,而狡猾的曹操知道后立刻改变了这个属性,结果造成了西凉兵识别不能;第二次,马超用了一个SetTOProperty()的方法改变了士兵们脑海中的记忆,他告诉士兵们:“胡子很长的那个是曹操!”,于是西凉兵们又带着“胡子长度 = 长”这个辅助属性去识别曹操,谁知曹操又一次巧妙地改变了自己的胡子属性,再一次使西凉兵识别不能;第三次,马超又用了一个SetTOproperty() 的方法把长胡子改成了短胡子,哈哈,要知道胡子剪短容易,变长难,西凉兵们根据“胡子长度 = 短” 这个属性成功匹配曹操这个对象,看来曹操这次是真的逃不掉了! 

强制属性、辅助属性和顺序标识
        还是用我们人脑识别人来打比方,下面列出了一些关于识别人的强制属性、辅助属性和顺序标识:
        强制属性:身份证号码、指纹、DNA、性别(可选,至于为什么是可选,大家都懂的。。。)、……
        辅助属性:身高、年龄、外貌、体型、声音、着装、……
        顺序标识:住址、站在谁的旁边、坐第几排第几个、……
        相信大家看了上面的例子之后应该会有种豁然开朗的感觉,QTP去识别对象也是通过QTP的一些封装属性去识别,并且按照强制属性 --> 辅助属性 --> 顺序标识的优先级去识别对象。


于是我知道了得靠强制属性去解决问题 
表现就是开着智能提示 脚本跑的通,
关闭智能提示 报找不到对象的错误
hightlight对象库里的对象还可以定位到对象 

一、QTP关于无法识别Link对象的解决办法

QTP录制时自动将Link对象的描述属性设为:text和html tag,而在实际应用中,链接的text属性值是经常变化的,这样脚本回放的时候就会经常发生找不到对象的错误.针对这个问题,有几个解决方案:
  1.修改对象仓库中对性的描述属性:
  去掉text,添加url,这样既能够保证能按照链接找到页面,而且text属性的变化也不影响对象的识别. 

当然我没有去掉这个text属性,不过加了url 确实不一样 好使了 
二、既可以输入又可以选择的combo
输入框被识别为webedit 但是使用set方法时 明明看见set进去了 保存的时候 就没保存上  
选择的时候项目识别的WebElement
这是一个easyui-combobox 
  


用以下代码 可以实现选择一个从Excel里参数化的数据 然后点击这个数据
这是模拟选择:
text=MyExcelSheet.cells(i,3) 
Browser("").Page("").Frame("").WebElement("").SetTOProperty  "innertext",text 
Browser("").Page("").Frame("").WebElement("").Click  
这是模拟输入:
模拟输入真的是很纠结 试过虚拟对象,没法虚,试过object.value失败,试过document.write失败
最后用了一个剪切板+sendkey模拟ctrl+v粘贴 成功了 

Set MyClipboard = CreateObject("Mercury.Clipboard")
MyClipboard.Clear
MyClipboard.SetText "TEST"
MsgBox MyClipboard.GetText
.WebEdit("WebEdit_3").click
'粘贴
Call SendKey  ("^v")

TAG:

 

评分:0

我来说两句

Open Toolbar