TA的每日心情 | 奋斗 2014-12-30 11:00 |
---|
签到天数: 3 天 连续签到: 2 天 [LV.2]测试排长
|
最近被智能识别害惨了,于是又重新啃了一遍第一章 发现还是理解不了
不过到是看到了一些有趣的东西
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")
三、双击后出现列表提供选择,支持首字母查询
输入框被识别为webedit 但是使用set方法时 明明看见set进去了 保存的时候 就没保存上
选择的时候项目识别的WebElement
难点是双击,其实也很简单,无论用Object.FireEvent("ondblclick") 还是用Object.FireEvent("ondblclick") 都无法实现双击
其实写两遍单击就可以是双击 不写就等着报找不到对象的错误吧
Browser("").Page("").Frame("mainFrame").WebEdit("WebEdit_5").Click
Browser("").Page("").Frame("mainFrame").WebEdit("WebEdit_5").Click
Browser("").Page("").Frame("mainFrame").WebElement("人").SetTOProperty "innertext",summary1
Browser("").Page("").Frame("mainFrame").WebElement("人").Click
四、combo-datebox 日期控件的处理
感觉和之前的日期控件也差不多 可惜按以前的方法处理不了
审查元素 如下:
<input type="text" class="combo-text validatebox-text" autocomplete="off" style="width: 111px; height: 20px; line-height: 20px;">
从论坛只找到2篇文章
object.innerText
object.value
object.setAttribute "value", "2013-12-25", 0
以上三种方法都不好使
spy发现innertext也是空的,那么你用Object.innertext来赋值确实就没作用
然后我发现 我们在日期控件上输入回车 会默认当天
于是我就这么处理了
Browser("").Page("").Frame("e").WebEdit("计划开始时间").Click
Call SendKey("{ENTER}")
Browser("").Page("").Frame("").WebEdit("计划开始时间").set "2013-12-25"
|
|