51Testing软件测试论坛
标题:
QTP日期控件识别与参数化(加强版)
[打印本页]
作者:
xuben
时间:
2009-3-25 16:25
标题:
QTP日期控件识别与参数化(加强版)
QTP
日期控件识别与参数化(加强版)
(引用请注明出处)
作者:许奔
博客地址:
http://www.cnblogs.com/xuben
邮箱:
3231435@163.com
QQ
:
420524900
先长舒一口恶气再说
..................
好了,说说今天解决的一个很麻烦的问题
——
日期控件识别并参数化!~
今天突然想把日期控件参数化,结果发现
日期控件取时间是这样的
Browser("xxx").Page("xxx").Frame("Frame").WebElement("WebTable").Click
一开始思维很简单,取出每个日期的相对坐标,然后将相对坐标参数化。
为此,我特意用
Object Spy
看了一下这个控件上日期的相对坐标(横坐标依次是:
336
,
359
,
390
,
415
,
444
,
470
,
488
)(纵坐标依次是:
360
,
380
,
400
,
420
,
440
),如此,通过横纵坐标就可以取到任意一个日期;
但还没等实现我就发现这个问题,这样的方式就算实现也很不直观,严重影响阅读效果;
于是到网上查了一下,有个帅哥说道,可以在
Tools->Options->Web
标签
->Advanced->Recordsetting
里将除了
Record coodinates
外的全都勾选上
,然后在
Tools->Web Event Recording Configuration->CustomSetting
里将
onmouseover
和
onmousedown
改为
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)
运行,成功了
.................................
毕竟还是很开心的,毕竟每一步都在向成功的方向逼近,有安排有步骤地顺着白痴电脑的思路走,总有办法让白痴电脑顺着你的思路走的,哈哈!~
继续努力!~加油!~
作者:
假装不在
时间:
2009-3-25 19:21
::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 是有一些小小区别的,例如字体等等,判断他们,并点击。
哈哈,引玉。
作者:
xuben
时间:
2009-3-25 22:30
哈哈,非常非常谢谢你的详细说明,不过我还有一些小小的疑问:
第一,我这个日期控件就是不能用SET的,不过无论日期控件是什么,最后都要将选择好的日期填写到一个文本框里,而通过value正是修改了文本框取到的值(不过的确可能出现不同机器格式不同的问题),但修改文本框值与控件本身没有任何关系啊?
第二,如果用spy探测控件类型的话,如果将你所说的“连接”或“点击”参数化呢?
我才开始玩QTP,请高手赐教!
万分感谢!
作者:
onlonely
时间:
2009-3-26 08:56
由于你对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)
这样的代码在任何不管什么页面中的日期控件,只要这个日期控件的名称不改,就能使用.
记住是任何页面的..
作者:
xuben
时间:
2009-3-26 09:49
我正在学描述性编程,非常感谢!
不过2楼的意思是赋值给value遇到一些控件会出现错误,描述性编程的确灵活很多,但在这里仍然是赋值给value,如果value会错误,我不知道描述性编程怎么解决这个问题?
谢谢高手解答!
作者:
natasha01216
时间:
2009-3-26 11:11
受教育的说
还有,网上好多帅哥呀
作者:
yxd2006
时间:
2009-3-28 10:13
用SET一般都可以
Browser("XXX").Page("XXX").Frame("XXX").WebEdit("time:date3").Set "2009-03-05"
作者:
云絮飘扬
时间:
2010-3-10 15:22
正好是我想找的,好好学习
作者:
591728103
时间:
2010-3-10 16:02
标题:
xuexi
作者:
班小丸
时间:
2012-6-22 16:23
Mark,回家继续看。顶!
作者:
17800455
时间:
2012-6-23 13:29
哈,日期控件,本来和那个最后显示日期的文本框就是独立的,
操作完日期控件,只是给文本框赋个值。
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2