51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 4683|回复: 4
打印 上一主题 下一主题

【我分享】QTP关于无法识别XX对象的解决办法

[复制链接]
  • TA的每日心情
    奋斗
    2014-12-30 11:00
  • 签到天数: 3 天

    连续签到: 2 天

    [LV.2]测试排长

    跳转到指定楼层
    1#
    发表于 2014-12-25 13:00:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近被智能识别害惨了,于是又重新啃了一遍第一章 发现还是理解不了

    不过到是看到了一些有趣的东西

        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"


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 09:11
  • 签到天数: 936 天

    连续签到: 3 天

    [LV.10]测试总司令

    2#
    发表于 2014-12-25 13:02:54 | 只看该作者
    不错 不错 支持下~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:52
  • 签到天数: 1194 天

    连续签到: 2 天

    [LV.10]测试总司令

    3#
    发表于 2014-12-25 13:16:46 | 只看该作者
    谢谢分享 我都没时间整理呢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-2 19:27
  • 签到天数: 169 天

    连续签到: 1 天

    [LV.7]测试师长

    4#
    发表于 2014-12-28 13:35:08 | 只看该作者
    我弱弱的问一下,如果一个页面是嵌套开发的,里面嵌套了三四层页面的,里面有会第三层或其他层次的中间的页面上的对象操作控件,用QTP工作始终都无法识别出来的,请问该如何进行识别呢??
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-7-21 09:57
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]测试排长

    5#
    发表于 2016-6-6 23:03:39 | 只看该作者
    WebTable对象
    celldate=Browser("micClass:=Browser").Page("micClass:=Page").WebTable("micClass:=WebTable","html id:=articlelist").GetCellData(cRow+1,2)
    每次运行到这句的时候,就报错,提示“无法标识对象WebTable属于类WebTable”
    WebTable对象的属性值都换了几个都,还是提示一样的错误。
    求指点~
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-25 01:50 , Processed in 0.065906 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表