51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 5777|回复: 10
打印 上一主题 下一主题

[原创] QTP日期控件识别与参数化(加强版)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2009-3-25 16:25:20 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
QTP日期控件识别与参数化(加强版)
(引用请注明出处)


作者:许奔
博客地址:http://www.cnblogs.com/xuben
邮箱:3231435@163.com
QQ420524900



先长舒一口恶气再说..................
好了,说说今天解决的一个很麻烦的问题——日期控件识别并参数化!~
今天突然想把日期控件参数化,结果发现日期控件取时间是这样的Browser("xxx").Page("xxx").Frame("Frame").WebElement("WebTable").Click
一开始思维很简单,取出每个日期的相对坐标,然后将相对坐标参数化。
为此,我特意用Object Spy看了一下这个控件上日期的相对坐标(横坐标依次是:336359390415444470488)(纵坐标依次是:360380400420440),如此,通过横纵坐标就可以取到任意一个日期;
但还没等实现我就发现这个问题,这样的方式就算实现也很不直观,严重影响阅读效果;
于是到网上查了一下,有个帅哥说道,可以在Tools->Options->Web标签->Advanced->Recordsetting里将除了Record coodinates外的全都勾选上,然后在Tools->Web Event Recording Configuration->CustomSetting里将onmouseoveronmousedown改为Enable(我没找到onmousedown)即可;
我改了,发现识别出来多了这样两句:
Browser("Browser").Page("DocumentForm_2").Sync
Browser("Browser").Navigate"http://10.0.0.60/COG/calendar/My97DatePicker.htm"
到网上查了一下,Sync是等到页面加载完毕进行下一步操作,而Navigate是导航到特定的你所想的web页或者文件,不过是为了打开这个日期控件,不过意外学到一些知识:

部分Browser方法,如Navigate、Back、Home、Refresh等在某些人的机器上是好用的,但在另外一些人的机器上就不好用了。脚本执行到这些方法,并不会抛出错误;而且qtp日志里看到的状态是"done".
经过一段时间的观察,终于发现这些机器上IE加载项(IE"工具"->"管理加载项")的不同:
BHOManager Class插件的问题。文件名是BHOManager.dll,部分人的机器上该插件被禁用或删除掉了,猜测原因可能是使用了某些清理ie的工具导致。
解决该问题的方法很简单:
如果是被禁用了,只要重新启用即可;如果是被删除掉了,可以重新安装qtp,或者从别处拷贝BHOManager.dll文件过来,用regsvr32 BHOManager.dll注册后就可以了。



学新知识归新知识,问题还是要解决的,网上另一个帅哥说,可以用:Browser("xxx").Page("xxx").WebEdit("start_date").Object.value=DataTable("start_date",dtLocalSheet)的方法;
于是修改了一下自己的脚本,并自作主张地将DataTable改为了WebTable(因为我觉得我这边识别出来是WebTable,却没注意DataTable代表的是参数化后取值的表格);
运行,当然不行,发现问题,将WebTable改回了DataTable
运行,还是不行,发现start_date有问题(我这里又没有start_date这个参数名),于是DataTable表格里双击新列列头,增加新列,列名为start_date
运行,还是不行,说Object Repository里没有start_date(还没存日期显示框控件呢),于是Object Repository里增加日期显示框控件
并通过Object Spy看了一下显示框,标记
"ctl00$ContentPlaceHolder1$DMain1$CPDIssueData$txtShowDate",于是将该语句改为Browser("xxx").Page("xxx").WebEdit("ctl00$ContentPlaceHolder1$DMain1$CPDIssueData$txtShowDate").Object.value=DataTable("start_date", dtLocalSheet)
运行,还是不行,还说ObjectRepository里没
"ctl00$ContentPlaceHolder1$DMain1$CPDIssueData$txtShowDate",进去一看,没错啊,又存
了一次,发现问题,我应该在根目录下存取该控件,避免上层控件冲突;
运行,还是不行,还说Object Repository里没
"ctl00$ContentPlaceHolder1$DMain1$CPDIssueData$txtShowDate",再进去看,原来 Object Repository"ctl00$ContentPlaceHolder1$DMain1$CPDIssueData$txtShowDate"了一
个简称"ctl00$ContentPlaceHolder1$DMai",所以不要盲目用Object Spy给的名字,一切以Object Repository存的名称为准,将语句修改为:
Browser("xxx").Page("xxx").WebEdit("ctl00$ContentPlaceHolder1$DMai").Object.value=DataTable("start_date",dtLocalSheet)
运行,成功了.................................
毕竟还是很开心的,毕竟每一步都在向成功的方向逼近,有安排有步骤地顺着白痴电脑的思路走,总有办法让白痴电脑顺着你的思路走的,哈哈!~
继续努力!~加油!~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-7-13 14:04
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]测试排长

    11#
    发表于 2012-6-23 13:29:20 | 只看该作者
    哈,日期控件,本来和那个最后显示日期的文本框就是独立的,
    操作完日期控件,只是给文本框赋个值。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2012-6-22 16:23:10 | 只看该作者
    Mark,回家继续看。顶!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2010-3-10 16:02:35 | 只看该作者

    xuexi

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2010-3-10 15:22:01 | 只看该作者
    正好是我想找的,好好学习
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
    发表于 2009-3-28 10:13:17 | 只看该作者
    用SET一般都可以
    Browser("XXX").Page("XXX").Frame("XXX").WebEdit("time:date3").Set "2009-03-05"
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6#
    发表于 2009-3-26 11:11:00 | 只看该作者
    受教育的说

    还有,网上好多帅哥呀
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5#
     楼主| 发表于 2009-3-26 09:49:10 | 只看该作者
    我正在学描述性编程,非常感谢!
    不过2楼的意思是赋值给value遇到一些控件会出现错误,描述性编程的确灵活很多,但在这里仍然是赋值给value,如果value会错误,我不知道描述性编程怎么解决这个问题?
    谢谢高手解答!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
    发表于 2009-3-26 08:56:02 | 只看该作者
    由于你对QTP的编程了解还浅所以就经历了这么一个过程,不过你总算是找出结果了.

    2楼所说的的确是方法之一,那样做缺点是参数化内容多了.(你需要使用多个参数化,来参数年,月,日,还可能还需要参数小时分钟)
    .对于你说的脚本通用性,相信一个系统里面,日期的格式是不会乱变的吧.
    另外你识别出来的对象WebEdit("ctl00$ContentPlaceHolder1$DMai"),会这样恐怕是那个对象名称特别吧,一般都是如webedit("data")这样的格式的.

    最后,有空学学描述性编程吧,那样的脚本才兼容性强.
    比如"
    Browser("xxx").Page("xxx").WebEdit("ctl00$ContentPlaceHolder1$DMai").Object.value=DataTable("start_date",dtLocalSheet)
    改成:
    set test=browser("name:=(.)*").page("title:=(.)*")
    test.webedit("name:=ContentPlaceHolder1$DMai").object.value=DataTable("start_date",dtLocalSheet)

    这样的代码在任何不管什么页面中的日期控件,只要这个日期控件的名称不改,就能使用.
    记住是任何页面的..
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3#
     楼主| 发表于 2009-3-25 22:30:42 | 只看该作者
    哈哈,非常非常谢谢你的详细说明,不过我还有一些小小的疑问:
    第一,我这个日期控件就是不能用SET的,不过无论日期控件是什么,最后都要将选择好的日期填写到一个文本框里,而通过value正是修改了文本框取到的值(不过的确可能出现不同机器格式不同的问题),但修改文本框值与控件本身没有任何关系啊?
    第二,如果用spy探测控件类型的话,如果将你所说的“连接”或“点击”参数化呢?
    我才开始玩QTP,请高手赐教!
    万分感谢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2#
    发表于 2009-3-25 19:21:26 | 只看该作者
    ::yiwusuoyou:::
    1,遇见不能通过使用set 的空间这个方法就失效了。
    这个只能针对某些特定控件做操作。
    2,通过直接替换value的方法有好有坏,坏处
         1),不同机器的时间格式问题。直接使用set有可能导致脚本在不同机器跑会出现格式不正确,让脚本跑不下去情况。不过在服务器上跑脚本自然是好事。 就好像一台机器是E文版的,哪么时间格式是月日年,你通过控件操作出来的时间还是月日年,但你中文脚本的参数化是日月年。嘿嘿,抛砖抛砖。  
         2),有些控件的value是改不了的。
         3),时间随机与时间输入的允许性。
         这个主要针对某些时间输入过程中,会出现时间已经过去了,但你还做了这个时间输入,自然提交单子也会失败。
    好处在于使用这样可以迅速解决问题


    通常我个人觉得合理的解决方法不是你这样的。
    嘿嘿,这个自然和控件组对时间控件开发的尺度来定量。
    如果要考虑的以后日子都不需要去维护日期输入的脚本,其实方法不是哪么复杂:
    1,日期下拉的打开。有些时候是img,有些是大家害怕的webelement.先click了再说。
    2,下拉出许多日期,自然,过期或者无效的日期,字体是灰色的。
       在下来出来后,使用spy,看看这个日期数字东西是什么
        1)link  这个就高兴死你了,过期数字的link失效,只会是普通的字体,just click it as you like,嘿嘿。这种情况是我们最想看到的,其它的是link的,就都可以点。只要添加多点识别(需要根据实际判断),你别担心点到外面其他数字的连接,例如15号的连接等等。
        2)webelement  哈哈,样子是比link不好看点,不过,失效的日期和没失效的日期后台的html code 是有一些小小区别的,例如字体等等,判断他们,并点击。
    哈哈,引玉。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-9-20 23:36 , Processed in 0.074200 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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