51Testing软件测试论坛

标题: 只能识别一次的问题 [打印本页]

作者: 看雪时节    时间: 2007-9-29 14:55
标题: 只能识别一次的问题
一个界面上有 开始时间 和 结束时间 两个日期选择按钮,点击后 弹出日期选择框。
而选择时间的代码我写在一个Sub里了,我的目的是首先将当前年月得到,然后和要选择的年月进行比较然后点击相应的(上一、下一)年、月按钮,最后点击具体哪天!

当选择任意一个时间按钮选择时间成功后,点击另一个按钮选择时间时,
   报错 The test run cannot continue due to an unrecoverable error
报错代码如下:(目的得到当前年月,如九月,2007)
now=Browser("B").Page("P").Frame("F").WebElement("class:=title","html tag:=TD").GetROProperty("innertext")
   其中WebElement("class:=title","html tag:=TD")是选择框中上方的月,年的信息,如 (九月,2007)

请问怎么样解决?

[ 本帖最后由 看雪时节 于 2007-9-29 16:15 编辑 ]
作者: walker1020    时间: 2007-9-29 15:24
怎么就不能放个图片上来? 源代码是什么语言写的? 先看一下 QTP能否找到那个日期控件再说。
作者: 看雪时节    时间: 2007-9-29 15:52
标题: 回复 2# 的帖子
正如我说的,两个日期选择,第一个就能实现,而第二个就报错!~~
作者: jackymail    时间: 2007-9-29 15:59
我建议你还使用spy好好检查一下。
还是对象发生变更导致认为非法的调用之类的事情。

还有你说第一个时间第2个时间,到底是哪个?你有2组控件,6个按钮,都是关于时间的,应该说清楚一点,我是没看清楚反正。
作者: 看雪时节    时间: 2007-9-29 16:31
标题: 回复 4# 的帖子
谢谢你的回复,那我就继续补充一下:
点击 图中第一部分的两个按钮的任意一个,都会出现 第二部分的 时间选择框,
Sub SetDate(sDate) '用来实现在 时间选择框 里选择需要的年月日
...
now=Browser("B").Page("P").Frame("F").WebElement("class:=title","html
tag:=TD").GetROProperty("innertext")
...
End Sub
问题在于,如果我先选择了 用车开始时间(脚本运行正常) ,脚本运行到选择 用车结束时间 的时间选择框时,就报错!

而且我已经 Spy 了 这两个 时间选择框 的属性,没有任何多余的属性可用。能用到的只有class,html tag
作者: jackymail    时间: 2007-9-29 16:39
问题1:2个激活时间选择框的按钮的识别属性有区别吗?你怎么区分的?
问题2:你在激活时间选择框以后,有没有关闭的动作
问题3:你把顺序反过来,先选择结束时间,然后再开始时间呢?正常不?
作者: 看雪时节    时间: 2007-9-29 16:41
标题: 回复 6# 的帖子
问题1:录的时候自己区分Name=img_1、Name=img_2
问题2:当选择具体某一天后,将自动关闭
问题3:反过来的情况也一样,第二个会报错!

[ 本帖最后由 看雪时节 于 2007-9-29 16:45 编辑 ]
作者: jackymail    时间: 2007-9-29 16:44
原帖由 看雪时节 于 2007-9-29 16:41 发表
反过来的情况也一样,第二个会报错!

那问题或许就出在我的第2个问题,在你执行第一次操作以后,光标被剥夺了。不在原有的ui层面上了。你先把我的问题回答全了,我陪你一起研究一下
作者: jackymail    时间: 2007-9-29 16:46
你加一个wait 5 在两次操作之间
作者: 看雪时节    时间: 2007-9-29 16:46
标题: 回复 8# 的帖子
请看6#我重新编辑过的描述
作者: 看雪时节    时间: 2007-9-29 16:47
原帖由 jackymail 于 2007-9-29 16:46 发表
你加一个wait 5 在两次操作之间

这法子我也试了!~
作者: jackymail    时间: 2007-9-29 16:51
原帖由 看雪时节 于 2007-9-29 16:47 发表

这法子我也试了!~

你把getroproperty的步骤去掉还报错吗?
如果不报错就把WebElement("class:=title","html tag:=TD").这句话里面的描述性编程改成用对象库识别对象。
如果还不报错,就检查描述属性是否正确,如果报错就检查getroproperty的方法是否正确。
还有,你第一次运行正确的期间添加一个步骤,把getroproerty的信息打印出来。看看第一次是否真的成功取到了相关信息

[ 本帖最后由 jackymail 于 2007-9-29 16:55 编辑 ]
作者: 看雪时节    时间: 2007-9-29 16:57
原帖由 jackymail 于 2007-9-29 16:51 发表

你把getroproperty的步骤去掉还报错吗?
如果不报错就把WebElement("class:=title","html tag:=TD").这句话里面的描述性编程改成用对象库识别对象。
如果还不报错,就检查描述属性是否正确,如果报错就检查getro ...


MsgBox Browser("B").Page("P").Frame("F").WebElement("class:=title","html tag:=TD").Exist
在第二个选择框处为False

第一次选择时这些属性都能取到

[ 本帖最后由 看雪时节 于 2007-9-29 17:00 编辑 ]
作者: jackymail    时间: 2007-9-29 17:00
原帖由 看雪时节 于 2007-9-29 16:57 发表


MsgBox Browser("B").Page("P").Frame("F").WebElement("class:=title","html tag:=TD").Exist
在第二个选择框处为False


如果再开始时间的时候那次操作能够成功打印到True,那就manual得去操作第一个步骤,然后用spy检查在发生了第一个步骤以后,结束时间对应的哪个按钮的属性值,这个属性值应该是可用的,就是runtime的属性值。 我这样说是因为第一次操作的时候可能导致第2次操作对象的属性变更。
WebElement("class:=title","html tag:=TD")。也就是说2次获取值不能都用class:=title","html tag:=TD这个。应该是发生变更了,你先保留msgbox调试,直到都为true,然后在恢复到你的实际操作步骤


[ 本帖最后由 jackymail 于 2007-9-29 17:02 编辑 ]
作者: 看雪时节    时间: 2007-9-29 17:05
标题: 回复 14# 的帖子
有点不理解你让我怎么做了?
作者: jackymail    时间: 2007-9-29 17:11
class:=title","html tag:=TD
你上面的这个识别属性你自己怎么得到的?

你先用鼠标去点第一个步骤,别自动化。
一直做到该要做第二个步骤的时候,用你取 识别属性 的方法去识别(结束时间)第二次应该操作的那个按钮

不是有2个能弹出日期框的按钮吗,你第一次用鼠标点所有该完成的步骤,该到点第2次的时候停下来,别继续点,用spy(或者你自己的什么方法)去查找这个时候按钮2(结束时间里面涌来弹出日期选择框的那个按钮)的属性
原帖由 看雪时节 于 2007-9-29 17:05 发表
有点不理解你让我怎么做了?

作者: jackymail    时间: 2007-9-29 17:33
你咋不减了踪影。。万里长城马上就要走完了都。。
作者: 看雪时节    时间: 2007-9-29 17:47
标题: 回复 17# 的帖子
不好意思,没看到已经第二页了,我还说你咋不见影了!哈哈,看来是误会  

按你说的我也做了,先手动点击 第一个按钮,选择时间,然后 点击 第二个按钮,SPY得到当前年月的属性。
作者: jackymail    时间: 2007-9-29 17:50
原帖由 看雪时节 于 2007-9-29 17:47 发表
不好意思,没看到已经第二页了,我还说你咋不见影了!哈哈,看来是误会  

按你说的我也做了,先手动点击 第一个按钮,选择时间,然后 点击 第二个按钮,SPY得到当前年月的属性。


不是吧。。。。那这样的话估计别人也帮不上你什么,等我找到类似的我试试看然后告诉你
作者: 看雪时节    时间: 2007-9-29 17:53
我出错的地方不是在按钮点击,而是在于第二次打开了 时间选择框 后,没法取到 当前系统年月 的innertext值,从而报错

我去这个值的目的在于:因为测试使用的的年月和当前系统年月 有可能不同,所以先做个判断。
作者: 看雪时节    时间: 2007-9-29 18:01
TO:jackymail
真的就只能这样了?没办法解决吗?

真的很感谢你的帮助,关注我的问题到现在!谢谢!

[ 本帖最后由 看雪时节 于 2007-9-29 18:03 编辑 ]
作者: jackymail    时间: 2007-9-29 18:08
原帖由 看雪时节 于 2007-9-29 17:53 发表
我出错的地方不是在按钮点击,而是在于第二次打开了 时间选择框 后,没法取到 当前系统年月 的innertext值,从而报错

我去这个值的目的在于:因为测试使用的的年月和当前系统年月 有可能不同,所以先做个判断。

我说错了,不是查询第2次时候按钮的属性,是查询第2次时候对话框里面年月日那个webelement的识别属性。不过估计你也作了这个步骤。
等等吧,或许有高手一点的可以解决你的问题。

不客气。
作者: 看雪时节    时间: 2007-9-29 18:16
标题: 回复 22# 的帖子
恐怕帖子早都沉了!唉。。。
作者: jackymail    时间: 2007-9-30 09:25
你可以换一种方式取数据。用上层对象。
browser("Choose date").Page("Choose date").WebTable("<").GetCellData(1,2)


还有就是你如果有空重新检查一下我在22楼提到的问题。

我不行了。。跑了。。。呵呵
作者: hsjzfling    时间: 2007-9-30 11:36
1. 弱弱的问一下楼主,now这个变量你有定义过么,now本身是一个函数。。。如果定义过那还是可以正常使用的~
2. 用Spy查看下那个WebElment的对象层次结构,第一是看是否有异常,第二如果存在WebTable父对象,那么可以尝试24楼的方法
3. 对WebElement("class:=title","html tag:=TD")中的描述属性再提出疑问,楼主确定这两个属性值正确并且能唯一识别出对象么?
猜测问题应该是至少由两个或两个以上因素引起,导致了QTP产生了系统错误~
作者: 看雪时节    时间: 2007-10-8 16:40
标题: 回复 25# 的帖子
回复你的问题:
1、now只是我在这随便展示给大家而写的
2、WebElement父对象确实是WebTable
3、虽然现在用不到这个了,但当时写的属性确实对的
作者: 看雪时节    时间: 2007-10-8 16:50
原帖由 jackymail 于 2007-9-30 09:25 发表
你可以换一种方式取数据。用上层对象。
browser("Choose date").Page("Choose date").WebTable("


jackymail:不知道你是否还关注啊,我现在确实是把WebTable添加到对象库了,前面所有的识别都可以,包括 当前系统时间、年 月选择,但现在唯一的问题就是 在选择具体某一天时
   Browser("B").Page("P").Frame("F").WebTable("W").ChildItem(myDayRow,myDayColumn,"WebElement",0).Click                        却提示 The test run cannot continue due to an unrecoverable error.缺少对象: 'ChildItem(...)',是因为我这个方法问题?
但同时 Browser("B").Page("P").Frame("F").WebTable("W").GetCellData(myDayRow,myDayColumn)却能得到值。

一个假期回来继续请教,知道如何解决的朋友也希望能告诉我!谢谢!~~~
作者: hsjzfling    时间: 2007-10-8 17:47
建议还是先检查下为什么会报"不可恢复的错误"提示一般这类错误产生都是在通常所注意的焦点之外的~这得根据具体代码和被测程序排查错误
作者: 看雪时节    时间: 2007-10-8 18:09
原帖由 hsjzfling 于 2007-10-8 17:47 发表
建议还是先检查下为什么会报"不可恢复的错误"提示一般这类错误产生都是在通常所注意的焦点之外的~这得根据具体代码和被测程序排查错误

这是整个过程的最后一步,前面类似的
Browser("B").Page("P").Frame("F").WebTable("W").ChildItem(tabRow,tabColumn,"WebElement",0).Click
都可以正确实现,但当Row>=3时就出现这个错误,你觉得问题是什么?
作者: hsjzfling    时间: 2007-10-8 18:35
那就说明在这样的情况下Row不能>=3。。。
在论坛中看就过几次都有人遇到过Unrecoverable error,都没说怎么会产生的,而我自己也一直没遇到过这样的错误。这样的情况只能逐一排除干扰情况,比如把参数化的值都替换为常数;比如再录制一个点击Row>=3的元素,比较一下和编写的代码的区别,等等。。。
如果方便的话,我们可以远程连接下,让我看看具体的环境,也许我能多帮上一点~
作者: 看雪时节    时间: 2007-10-8 18:42
标题: 回复 30# 的帖子
把参数化的Row,Column换成具体的数,这个我都做过了,依然会出现27#的问题
作者: hsjzfling    时间: 2007-10-8 19:04
其实我觉得就这个日历的问题而言,用ChildObjects方法可能更方便实现需求。因为每个月1号对应在Table中的Column是不一样的,但是1-30/31(可由collection.count取得)号的相对序号却是固定的,用他们的共同属性将他们筛选出来(在WebTable中还有其它WebElement干扰的情况下使用,没有就不需要这步),用index来标识区分,这样就能得到1-30/31号的每一个WebElement
比较清晰的WebTable用GetCellData方法就很方便了,至于ChildItem方法我还没怎么用过。。。还需要点时间尝试它的一些用法及特性
作者: 看雪时节    时间: 2007-10-8 19:46
标题: 回复 32# 的帖子
你说的很对啊,每月1号位置不同,所以我做的步骤是:
首先得到一号所在的WeekDay,然后去处理需要的具体某天与一号的关系(自己写的代码),得到该天对应的行、列,然后就Click。
作者: hsjzfling    时间: 2007-10-8 19:59
标题: 回复 33# 的帖子
这样多麻烦。。。
可以先试试看我的方法吧

Set oDesc = Description.Create()
oDesc("micclass").Value = "WebElement"
'这里可以用更多属性来提取1-30号的对象
'比如oDesc("innerhtml") = ""   等等
Set WECollection = Browser("B").Page("P").Frame("F").WebTable("W").ChildObjects(oDesc)
maxDate = WECollection.Count   '这里检查下值是否为当月的天数,若不是就要另做下小处理
WECollection(iDay-1).Click   'iDay为要选择的天
作者: 看雪时节    时间: 2007-10-8 20:07
原帖由 hsjzfling 于 2007-10-8 19:59 发表
这样多麻烦。。。
可以先试试看我的方法吧

Set oDesc = Description.Create()
oDesc("micclass").Value = "WebElement"
'这里可以用更多属性来提取1-30号的对象
'比如oDesc("innerhtml") = ""   等等
Set  ...

恩,这个方法不错,我当时也想到用ChildObjects方法,可惜没去用,明天早上试试!~~谢谢
作者: hsjzfling    时间: 2007-10-8 22:04
标题: 回复 27# 的帖子
我刚试着用了下ChildItem方法,用来取WebTable中的对象是没有任何问题的,所以你的ChildItem方法应该是没什么问题。还是那样,将参数都设置为常数调试看看~再有问题那只能是程序其它部分,或者说是被测对象的特殊问题~

明天试好了ChildObejcts方法记得说声~这几天休息,在家闲着也怪无聊的
作者: 看雪时节    时间: 2007-10-9 10:49
标题: 回复 36# 的帖子
Browser("B").Page("P").Frame("F").WebTable("W").RowCount的值等于10,而从界面上可以看到只有9行,所以可能Table里面是不是还套有Table!
作者: jackymail    时间: 2007-10-9 11:08
原帖由 看雪时节 于 2007-10-9 10:49 发表
Browser("B").Page("P").Frame("F").WebTable("W").RowCount的值等于10,而从界面上可以看到只有9行,所以可能Table里面是不是还套有Table!

你的问题好像变了。
确实是10行,没有隐藏,仔细从头数到尾,是10行。

还有关于具体日期,我觉得如果需要的话,可以把1-31全部的link添加到对象库里,或者
link("html tag:=A","text:="&daynumber).click
作者: 看雪时节    时间: 2007-10-9 11:26
标题: 回复 38# 的帖子
呵呵!问题确实变了,附图中确实是10行,但这个行数是变的,怪我现在做的和附图不同。
由于每个月不同显示的原因,你说的把1-31全部WebElement(没有Link)添加到对象库是不是不现实呢?
现在的这个问题确实匪夷所思啊!我已经没辙了,还有方法没?
Dim oCount
Set oDesc = Description.Create()
oDesc("innertext").Value = "11"
oDesc("class").Value ="day"    ' 注释:这个值有两个"day"、"day weekend",怎么在这写?用正则表达式吗?
Set WECollection=
Browser("B").Page("P").Frame("F").WebTable("W").ChildObjects(oDesc)
oCount = WECollection.Count-1
WECollection(oCount ).Click
作者: 看雪时节    时间: 2007-10-9 16:32
没人帮我了吗?
作者: hsjzfling    时间: 2007-10-9 20:16
标题: 回复 39# 的帖子
不好意思,被人拉出去happy了~刚回家,还没吃饭~

可能我在33楼的方法有点问题,昨天想当然的写的,自己没调试。。(BS偶吧~)ChildObjects应该不支持micclass以外的属性吧。。。
另外列举两个方法吧,分别是用来取到一个WebElement对象和取所有符合条件的WebElement对象的集合:
第一:用隐式描述性编程来取单个的对象,也就是你最早使用的方法,但要确定描述的属性能够唯一标识某个对象,否则就会产生错误。它可以与正则表达式一起使用,威力比较大,不过执行速度往往会比较慢(因为要和每个对象都进行比较。。。不适合循环调用)~
Browser("B").Page("P").Frame("F").WebTable("W").WebElement("class:=day|day weekend","innertext:=要选择的天").Click

第二:用ChildObjects来取所有WebElement对象,然后通过一定条件来筛选符合条件的对象
Dim Days(31)
Set oDesc = Description.Create
oDesc("micclass").Value = "WebElement"
Set WebElements = Browser("B").Page("P").Frame("F").WebTable("W").ChildObjects(oDesc)
j = 0
For i = 0 to WebElements.Count - 1
        If WebElements(i).GetROProperty("class") = "day" or WebElements(i).GetROProperty("class") = "day weekend" Then
                Set Days(j) = WebElements(i) '将符合条件的对象逐一存入对象数组Days中
                j = j + 1 'j为存入的对象个数
        End if
Next
这种方法的扩展性就比较强些,可以任意取符合指定条件的对象集合,也可以从集合中随意取出想要的元素

[ 本帖最后由 hsjzfling 于 2007-10-10 15:21 编辑 ]
作者: jackymail    时间: 2007-10-10 10:44
原帖由 看雪时节 于 2007-10-9 11:26 发表
呵呵!问题确实变了,附图中确实是10行,但这个行数是变的,怪我现在做的和附图不同。
由于每个月不同显示的原因,你说的把1-31全部WebElement(没有Link)添加到对象库是不是不现实呢?
现在的这个问题确实匪夷所 ...


你的这个问题已经超越了使用qtp的意义。如果搞得那么复杂干脆就不要用qtp好了。如果你们开发的产品就是这个日历的话咱们另当别论。

还有就是把1-31全部包含到对象库非常可行,一共只有31个对象,或者使用我提供的描述性编程,也无非在1-31之间变化。任何一个月份不会超过31,而你若只适用text作为link的识别对象,对于每个月的1-31日的link对象都能够正确的识别。不会有问题。还有就是对于闰月的情况,比如只有28天之类的,我觉得做太多的容错来测试你的程序已经完全失去使用qtp意义。
你的月份和年份都不是普通的dropdown button我觉得这样的东西去判断然后再操作也同样没有意义。
作者: 看雪时节    时间: 2007-10-10 10:54
标题: 回复 42# 的帖子
我说的问题和我们的项目没什么关系,只不过遇到无法解决的问题很想弄清楚了!
作者: jackymail    时间: 2007-10-10 11:14
本帖最后由 jackymail 于 2010-10-18 09:55 编辑
原帖由 hsjzfling 于 2007-10-9 20:16 发表
不好意思,被人拉出去happy了~刚回家,还没吃饭~

可能我在33楼的方法有点问题,昨天想当然的写的,自己没调试。。(BS偶吧~)ChildObjects应该不支持micclass以外的属性吧。。。
另外列举两个方法吧,分别是用来 ...


micclass以外?所有的可识别属性都可以使用在childobjects..
作者: jackymail    时间: 2007-10-10 11:15
原帖由 看雪时节 于 2007-10-10 10:54 发表
我说的问题和我们的项目没什么关系,只不过遇到无法解决的问题很想弄清楚了!

希望你找到答案。
作者: rojer521    时间: 2007-10-10 11:23
标题: 两个取时间的控件应该是一样的,录制的时候你会看到它的index 是不一样的
所以录制时,只需要录制一个,在操作时,设定不同的index,就可以对两个都进行操作了
作者: 看雪时节    时间: 2007-10-10 11:57
原帖由 hsjzfling 于 2007-10-9 20:16 发表
不好意思,被人拉出去happy了~刚回家,还没吃饭~

可能我在33楼的方法有点问题,昨天想当然的写的,自己没调试。。(BS偶吧~)ChildObjects应该不支持micclass以外的属性吧。。。
另外列举两个方法吧,分别是用来 ...


呵呵,谢谢你还关注,问题看来只能用描述性编程了,也就又回到了我最初的方法了。----你的第一个方法
第二个方法我已经使用过了,呵呵
我现在却更关注与为什么ChileItem方法出这个错的问题上了。
作者: hsjzfling    时间: 2007-10-10 14:39
标题: 回复47# 的帖子
再看了下你在27楼的内容:
原帖由 看雪时节 于 2007-10-8 16:50 发表
Browser("B").Page("P").Frame("F").WebTable("W").ChildItem(myDayRow,myDayColumn,"WebElement",0).Click                        却提示 The test run cannot continue due to an unrecoverable error.缺少对象: 'ChildItem(...)',是因为我这个方法问题?


QTP提示是在某一次执行.ChildItem(...).Click操作的时候找不到ChildItem对象,可以通过输出对象某个属性的方法来进行调试,看看是否程序的逻辑设计有问题,指定的Row,Column在WebTable中所对应的WebElement是否为自己所想要的

Set myDay=Browser("B").Page("P").Frame("F").WebTable("W").ChildItem(myDayRow,myDayColumn,"WebElement",0)

If myDay.GetROProperty("innertext") = iDay and (myDay.GetROProperty("class") = "day" or myDay.GetROProperty("class") = "day weekend") then
   msgbox "找到正确的对象"
   myDay.Click
Else msgbox "未找到正确的对象"
End If
或者直接查看其对象:
msgbox myDay.GetROProperty("innertext")  & vbcrlf & myDay.GetROProperty("class")

[ 本帖最后由 hsjzfling 于 2007-10-10 14:47 编辑 ]
作者: hsjzfling    时间: 2007-10-10 15:18
标题: 回复 44# 的帖子
呵呵~ChildObjects确实可以那样用的,昨天仓促之下尝试的时候不小心犯了个低级错,结果以为是不能那样用。。。后来用其它方法的时候发现修改了那个错,却忘了再试一下ChildObjects了~
QTP封装的对象、方法还是很多的,一个个慢慢研究有点累,需要用哪个方法或某个方法的特定用法的时候才回去认真研究~
已经加了你的MSN,有空可以多交流~
PS:就测试而言,偶还是个刚工作一个月的新手,以后还是有很多不懂的需要请教大家的~
作者: 看雪时节    时间: 2007-10-11 16:01
to  hsjzfling:
又有新问题了,由于我的OR里只有一个table对象,所以像图中有两个时间选择框的情况下,第二个选择框被打开后,时间依然是第一个在变化,这种情况如何处理呢?而我现在又不想继续添加table对象了,怎么能适应不同的情况呢?
作者: hsjzfling    时间: 2007-10-11 16:32
如果对象是在不同页面(刷新或者跳转过)的话那很好处理QTP自己能识别,同个页面可以尝试对WebTable对象进行描述性编程,不过不保证一定能行~
建议最好还是老老实实添加对象吧,反正也不是很麻烦~
ps:前几天我也就是为了让对象库简洁好看,就乱搞对象,结果把QTP搞的神经错乱,胡乱认对象了(属性值与对象库中的完全不符合它也认为是一个对象。。。)
作者: 看雪时节    时间: 2007-10-11 16:43
标题: 回复 51# 的帖子
呵呵,因为我们公司很多开发代码都是共享入库,像这些JS之类的东西在很多地方都是直接拿来用的,我想着就是直接把这些对象保存为TSR文件,然后实现方法写成VBS文件以后可以在不同的地方使用。
是不是懒的后果就是这样。呵呵呵




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2