51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 11921|回复: 41
打印 上一主题 下一主题

当前问题:如何使用正则表达式实现Flights程序中WinList里的项目选择?(2012-3-26)

[复制链接]
  • TA的每日心情
    擦汗
    昨天 08:59
  • 签到天数: 1021 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2012-3-13 10:43:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    本周的问题为“如何使用正则表达式实现Flights程序中WinList里的项目选择”

    如果你也有问题想提出来和大家一起讨论,
    请点击此处>>
    说不定下期讨论的问题就是由你提出的哦,请快快参与吧!


    获奖名单

    奖项

    获奖名单

    奖励

    答案链接

    一等奖

    hsjzfling

    手机充值卡50元

    33#

    二等奖

    icegirl1202

    300论坛积分

    10#

    本帖子中包含更多资源

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

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

    使用道具 举报

  • TA的每日心情
    无聊
    2016-4-5 09:13
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    42#
    发表于 2012-4-9 15:10:12 | 只看该作者
    不懂、
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    41#
    发表于 2012-4-7 21:24:37 | 只看该作者
    楼主的目的只是为了按照参数选取下拉列表中的值而已,并不是为了检验其中的格式。所以我说这种情 ...
    duangang312 发表于 2012-4-7 18:06

    如果下拉列表有数据格式不正确,测试要怎么发现错误呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    40#
    发表于 2012-4-7 18:06:47 | 只看该作者
    我不认同你的观点,不严格匹配怎么能测试出程序的错误呢?
    楼主只是给了一个例子,列表中除了FRA、LAX还 ...
    mimmy 发表于 2012-4-7 00:07



        楼主的目的只是为了按照参数选取下拉列表中的值而已,并不是为了检验其中的格式。所以我说这种情况下,使用简单匹配足够了。我写的只是一个例子咯,如果想要别的参数,尽可以把这段代码封装成一个函数,调用即可。使用正则要看场合,能不用正则就不用正则,毕竟使用正则会影响性能,可读性也不好。正则写复杂了,出错的可能性太大,比方你写的这里,你觉得12:01PM是正确的值么?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    39#
    发表于 2012-4-7 00:07:59 | 只看该作者
    写的太啰嗦了,用不着这样的,这种测试代码里面不需要严格匹配的。所以尽可以用\d+\s+\W+这种方法来匹配 ...
    duangang312 发表于 2012-4-6 22:45

    我不认同你的观点,不严格匹配怎么能测试出程序的错误呢?
    楼主只是给了一个例子,列表中除了FRA、LAX还有其他代码,不能在表达式里写死了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    38#
    发表于 2012-4-6 22:45:47 | 只看该作者
    ^\d{4,5}\s{3}([A-Z]{3}\s{3}(0[0-9]|1[0-2]):[0-5][0-9]\s[AP]M\s{3}){2}[A-Z]{2,3}\s{5}\$[1-9][0-9]{2}\ ...
    mimmy 发表于 2012-3-27 18:23


    写的太啰嗦了,用不着这样的,这种测试代码里面不需要严格匹配的。所以尽可以用\d+\s+\W+这种方法来匹配。
    第二个,楼主的提议应该是根据某个参数来匹配选项。如这里,参数假如是出发(FRA),到达城市(LAX),那么可以用.?FRA.?LAX来匹配,其实就可以了,用不着这么复杂。在这个场景下面,这个表达式足够用了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    37#
    发表于 2012-3-27 18:23:17 | 只看该作者
    ^\d{4,5}\s{3}([A-Z]{3}\s{3}(0[0-9]|1[0-2]):[0-5][0-9]\s[AP]M\s{3}){2}[A-Z]{2,3}\s{5}\$[1-9][0-9]{2}\.[0-9]{2}$

    下面我的测试数据:
    20332   FRA   10:12 AM   LAX   05:23 PM   AA     $112.20
    12490   LON   10:24 AM   PAR   12:24 PM   AF     $167.20
    5174   POR   09:05 AM   DEN   10:46 AM   NW     $145.00
    11553   SEA   08:00 AM   SYD   11:00 AM   DL     $252.50
    15595   SEA   12:13 PM   LON   01:39 PM   QF     $138.40
    16968   SYD   10:38 AM   SFO   12:48 PM   QF     $196.40
    1060   SEA   11:02 AM   SFO   12:43 PM   TWA     $168.20
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    36#
    发表于 2012-3-26 12:52:40 | 只看该作者
    回复 33# hsjzfling


        这个答案不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    35#
    发表于 2012-3-25 14:12:26 | 只看该作者
    不明白额。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    34#
    发表于 2012-3-24 17:07:33 | 只看该作者
    新人来学习不太懂
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    33#
    发表于 2012-3-22 20:02:03 | 只看该作者
    本帖最后由 hsjzfling 于 2012-3-22 20:08 编辑

    先分析题意,目的应该是让选项的值中支持使用正则表达式。代码如下

    1. 'Select WinList中选项时支持使用正则表达式
    2. Function RegExpSelect(objWinList, strPattern)
    3. Dim objRegExp, arrAllItems, intIndex
    4. '创建正则表达式对象,设置区分大小写
    5. Set objRegExp = New RegExp
    6. objRegExp.IgnoreCase = False
    7. objRegExp.Pattern = strPattern
    8. '取到WinList下的所有选项的文本,赋值到数组
    9. arrAllItems = Split(objWinList.GetROProperty("all items"), VbLf)
    10. '遍历选项数组
    11. For intIndex = 0 To UBound(arrAllItems)
    12.   '判断表达式是否能匹配当前选项,能匹配则选中之,否则继续循环
    13.   If objRegExp.Test(arrAllItems(intIndex)) Then
    14.    objWinList.Select intIndex
    15.    Reporter.ReportEvent micPass, "RegExpSelect Successful", "Pattern=" & strPattern & "   First Matched Item=" & arrAllItems(intIndex)
    16.    Set objRegExp = Nothing
    17.    Exit Function
    18.   End If
    19. Next
    20. '若遍历完所有选项都不能匹配,则报出不能匹配的错误,写入日志中
    21. Reporter.ReportEvent micFail, "RegExpSelect Failed ", "No Item Matched, Pattern=" & strPattern
    22. End Function
    复制代码


    然后是函数的使用示例,这里我们可以直接将之注册到WinList对象的方法中去,示例如下

    1. '将RegExpSelect函数注册到WinList的方法中去
    2. RegisterUserFunc "WinList", "RegExpSelect", "RegExpSelect"
    3. '在WinList中使用RegExpSelect方法,选择第一个能符合表达式的选项
    4. '比如这里希望能自动选一个上午10点到12点间Portland飞往Los Angeles且价格低于180美金的航班
    5. Window("Flight Reservation").Dialog("Flights Table").WinList("From").RegExpSelect "\d+ POR 1[01]:[0-5][0-9] AM LAX \d{2}:\d{2} [AP]M \w+ \$1[0-7]\d\.\d{2}"
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-5-5 09:03
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    32#
    发表于 2012-3-22 15:52:43 | 只看该作者
    正则表达式,还没用过,学习哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    31#
    发表于 2012-3-21 19:10:46 | 只看该作者
    新手 不懂 同求
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    30#
    发表于 2012-3-21 11:01:35 | 只看该作者
    来学习,顶一下!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29#
    发表于 2012-3-20 21:35:43 | 只看该作者
    学习了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    28#
    发表于 2012-3-20 18:07:17 | 只看该作者
    谢谢楼上大神 看了不是很明白 才接触 测试。。。。以后会多多努力
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    27#
    发表于 2012-3-20 17:00:02 | 只看该作者
    可以作随机数获取winlist
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26#
    发表于 2012-3-20 12:45:04 | 只看该作者
    LS的好详细啊,WinList里的项目选择,真的要再审下题了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-1-10 09:52
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    25#
    发表于 2012-3-20 11:22:39 | 只看该作者
    本帖最后由 da乐 于 2012-3-20 11:26 编辑

    百度了下
    Function IsRegEqual(s_Text, s_Pattern)
      Dim regEx, retVal ' 变量
      Set regEx = New RegExp ' 创建正则表达式 .
      regEx.Pattern = s_Pattern ' 模式
      regEx.IgnoreCase = True
      IsRegEqual = regEx.Test(s_Text)
    End Function

    Function SelectByText(objWebList,s_Text,b_RegExpression)
      Set obj_Options=objWebList.object.options
      i_Count =obj_Options.length - 1
      For i=0 to i_Count
        If b_RegExpression And IsRegEqual(obj_Options(i).text,"^"+ s_Text) Then
          obj_Options(i).selected=True
          Exit for
        Elseif Lcase(s_text)=Lcase(obj_Options(i).text) then
          obj_Options(i).selected=True
          Exit for
        End If
      Next
    End Function

    Function SelectByValue(objWebList,s_Value,b_RegExpression)
      Set obj_Options=objWebList.object.options
      i_Count =obj_Options.length - 1
      For i=0 to i_Count
        If b_RegExpression And IsRegEqual(obj_Options(i).value,"^" & s_Value) Then
          obj_Options(i).selected=True
          Exit for
        Elseif Lcase(s_text)=Lcase(obj_Options(i).value) then
          obj_Options(i).selected=True
          Exit for
        End If
      Next
    End Function

    Function SelectByIndex(objWebList,i_Index)
      objWebList.object.options(i_Index).selected=True
    End Function

    下面是例子:

    SelectByText Browser("Find a Flight: Mercury").Page("Find a Flight: Mercury").WebList("fromPort"),".*ond.*",TRUE
    SelectByValue Browser("Find a Flight: Mercury").Page("Find a Flight: Mercury").WebList("fromPort"),"san.*francisco",TRUE
    SelectByIndex Browser("Find a Flight: Mercury").Page("Find a Flight: Mercury").WebList("fromPort"),3
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    昨天 08:59
  • 签到天数: 1021 天

    连续签到: 2 天

    [LV.10]测试总司令

    24#
     楼主| 发表于 2012-3-19 10:40:18 | 只看该作者
    回复 8# msnshow


        恩,是QTP里面的知识哦!
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-9-20 06:07 , Processed in 0.091870 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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