免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6126 | 回复: 6
打印 上一主题 下一主题

如何写判断语句 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-24 16:22 |只看该作者 |倒序浏览
如何写判断语句


一说到判断,大家一定会想if-else呗,这个有啥的。可就是我们经常用的if-else给我们的程序带来了,繁琐的结构,晦涩的代码,凌乱的组织。我经常看到,完全看不懂的判断,在哪里疯狂猜测,这个是要干什么,有的时候甚至我要找到我需要调试的的一个分支,需要用去好长时间。到底判断语句怎么了,我想通过一个例子讨论一下判断怎么写才好:


判断应该是在程序中经常使用的,分支交交叉叉,当条件复杂,情况凌乱的时候,我们的判断也呈现了,恐怖的繁琐,应该怎么做,其实我也做了一些思考,下面就用一个例子,一步步探讨一下应该怎么写判断语句。
Ruby代码
  1. if pmd.text_field(:name,"msgHolder").exist?   
  2.                   msg=pmd.text_field(:name,"msgHolder").text   
  3.                   @log.info("弹出modal_dialg窗口信息如下:[#{msg}],标题:[#{p_title}]")   
  4.                   if msg.index("是否缴费")   
  5.                     pmd.button(:id,"btnYes").click   
  6.                   elsif msg.index("检查通过,是否继续")   
  7.                     pmd.button(:id,"btnYes").click   
  8.                   elsif msg.index("用户目前积分")   
  9.                     pmd.button(:id,"btnYes").click   
  10.                   elsif msg.index("打印")   
  11.                     pmd.button(:id,"btnNo").click   
  12.                   elsif msg.index("对不起")   
  13.                     @log.warn("弹出异常窗口窗口[#{msg}],标题:[#{p_title}]")   
  14.                     #pmd.button(:id,"btnOK").click   
  15.                     raise "出现异常窗口,提示信息如下:#{msg}"  
  16.                   elsif msg.index("错误信息")   
  17.                     @log.warn("弹出异常窗口窗口[#{msg}],标题:[#{p_title}]")   
  18.                     #pmd.button(:id,"btnOK").click   
  19.                     raise "出现异常窗口,提示信息如下:#{msg}"  
  20.                   elsif msg.index("检查不通过:当前用户不是正常在网用户err!!!")   
  21.                     @log.warn("弹出异常窗口窗口[#{msg}],标题:[#{p_title}]")   
  22.                     #pmd.button(:id,"btnOK").click   
  23.                     raise "出现异常窗口,提示信息如下:#{msg}"  
  24.                   elsif msg.index("确定要提交")   
  25.                     pmd.button(:id,"btnYes").click   
  26.                   elsif msg.index("业务受理完成")   
  27.                     pmd.button(:id,"btnOK").click   
  28.                   elsif msg.index("操作成功")   
  29.                     pmd.button(:id,"btnOK").click   
  30.                   else  
  31.                     @log.warn("不存在弹出modal_dialg窗口的默认处理方式:[#{msg}],标题:[#{p_title}]")   
  32.                     if pmd.button(:id,"bunOK").exists?   
  33.                       pmd.button(:id,"bunOK").click   
  34.                     elsif pmd.button(:id,"btnYes").exists?   
  35.                       pmd.button(:id,"btnYes").click   
  36.                     elsif pmd.button(:id,"btnNo").exists?   
  37.                       pmd.button(:id,"btnNo").click   
  38.                     end  
  39.                   end  
  40. end  
复制代码
这是一段自动化测试执行的时候,判断弹出窗口,之后进行相应处理的代码,我想在遇到这样的情况,很多人都会选用跟我一样的方式进行处理。这样一个代码不知道真是让人不知道从何看起,就好像一团乱麻。有的人,会第一个提出来,说,嗯用switch的语句,比if-else好看,你这样应该用switch;稍等,这这里面判断用的是index()判断字符串是否包含一个字符串,switch是判断相等,这样做不行,也许可以合并if条件。那代码就化简成这个样子了:

Ruby代码
  1. if pmd.text_field(:name,"msgHolder").exist?   
  2.   msg=pmd.text_field(:name,"msgHolder").text   
  3.   @log.info("弹出modal_dialg窗口信息如下:[#{msg}],标题:[#{p_title}]")   
  4.   if msg.index("是否缴费") || msg.index("检查通过,是否继续") || msg.index("用户目前积分") ||  msg.index("确定要提交")   
  5.     pmd.button(:id,"btnYes").click   
  6.   elsif msg.index("打印") || msg.index("对不起") ||  msg.index("错误信息") || msg.index("错误信息")   
  7.     pmd.button(:id,"btnNo").click   
  8.   elsif msg.index("业务受理完成") || msg.index("操作成功")   
  9.     pmd.button(:id,"btnOK").click   
  10.   else  
  11.     @log.warn("不存在弹出modal_dialg窗口的默认处理方式:[#{msg}],标题:[#{p_title}]")   
  12.     if pmd.button(:id,"bunOK").exists?   
  13.       pmd.button(:id,"bunOK").click   
  14.     elsif pmd.button(:id,"btnYes").exists?   
  15.       pmd.button(:id,"btnYes").click   
  16.     elsif pmd.button(:id,"btnNo").exists?   
  17.       pmd.button(:id,"btnNo").click   
  18.     end  
  19.   end  
  20. end  
复制代码
恩,这样似乎简单了许多,就这样就大功告成了吗?请注意:这里的判断条件之长啊,看起来很不和谐,查询起来也有问题,怎么办啊?有的时候根本看不懂判断条件都判断了什么。关于各种判断条件过长的问题,也许可以定义一个函数去做处理,那就这样写

Ruby代码
  1. def ifbtnyes(msg)   
  2.   msg.index("是否缴费") || msg.index("检查通过,是否继续") || msg.index("用户目前积分") ||  msg.index("确定要提交")   
  3. end  
  4. def ifbtnno(msg)   
  5.   msg.index("打印") || msg.index("对不起") ||  msg.index("错误信息") || msg.index("错误信息")   
  6. end  
  7. def ifbtnok(msg)   
  8.   msg.index("业务受理完成") || msg.index("操作成功")   
  9. end  
  10. if pmd.text_field(:name,"msgHolder").exist?   
  11.   msg=pmd.text_field(:name,"msgHolder").text   
  12.   @log.info("弹出modal_dialg窗口信息如下:[#{msg}],标题:[#{p_title}]")   
  13.   if ifbtnyes(msg)   
  14.     pmd.button(:id,"btnYes").click   
  15.   elsif ifbtnno(msg)   
  16.     pmd.button(:id,"btnNo").click   
  17.   elsif ifbtnok(msg)   
  18.     pmd.button(:id,"btnOK").click   
  19.   else  
  20.     @log.warn("不存在弹出modal_dialg窗口的默认处理方式:[#{msg}],标题:[#{p_title}]")   
  21.     if pmd.button(:id,"bunOK").exists?   
  22.       pmd.button(:id,"bunOK").click   
  23.     elsif pmd.button(:id,"btnYes").exists?   
  24.       pmd.button(:id,"btnYes").click   
  25.     elsif pmd.button(:id,"btnNo").exists?   
  26.       pmd.button(:id,"btnNo").click   
  27.     end  
  28.   end  
  29. end  
复制代码
这样吧判断移出来,看着好多了,但是我们还是发现,类似这样的判断 “msg.index("打印") || msg.index("对不起") ||  msg.index("错误信息") || msg.index("错误信息")”看起来还是很讨厌,而且我居然多出了三个函数(前往别说把三个函数判断简单合并起来形成一个函数,那样不是退回去了吗?)。我们还可以化简,其实我们发现函数一直都是在判断是否含有相应的操作,只是判断的内容不同,那也许可以进行这样的合并:

Ruby代码
  1. def getbtntype(msg)   
  2.   btnyes=["是否缴费","检查通过,是否继续","用户目前积分","确定要提交"]   
  3.   btnno=["打印","对不起","错误信息","错误信息"]   
  4.   btnok=["业务受理完成","操作成功"]   
  5.   btnyes.each do |b|   
  6.     if b.index(msg)   
  7.       return 1   
  8.     end  
  9.   end  
  10.     btnno.each do |b|   
  11.     if b.index(msg)   
  12.       return 2   
  13.     end  
  14.   end  
  15.     btnok.each do |b|   
  16.     if b.index(msg)   
  17.       return 3   
  18.     end  
  19.   end  
  20. end  
  21. if pmd.text_field(:name,"msgHolder").exist?   
  22.   msg=pmd.text_field(:name,"msgHolder").text   
  23.   @log.info("弹出modal_dialg窗口信息如下:[#{msg}],标题:[#{p_title}]")   
  24.   case(getbtntype(msg))   
  25.   when 1   
  26.     pmd.button(:id,"btnYes").click   
  27.   when 2   
  28.     pmd.button(:id,"btnNo").click   
  29.   when 3   
  30.     pmd.button(:id,"btnOK").click   
  31.   default   
  32.     @log.warn("不存在弹出modal_dialg窗口的默认处理方式:[#{msg}],标题:[#{p_title}]")   
  33.     if pmd.button(:id,"bunOK").exists?   
  34.       pmd.button(:id,"bunOK").click   
  35.     elsif pmd.button(:id,"btnYes").exists?   
  36.       pmd.button(:id,"btnYes").click   
  37.     elsif pmd.button(:id,"btnNo").exists?   
  38.       pmd.button(:id,"btnNo").click   
  39.     end  
  40.   end  
  41. end  
复制代码
这样化简了好多,也看到这里也是用了swtich,我们可以清晰地看到哪些字段,是应该做哪种操作的。从头到尾,是把弹出窗口分类出三类,但是,是否有会有特殊情况,是否有特殊情况,就要加一类啊?似乎维护性还不是很好,还可以继续优化,那么继续:

Ruby代码
  1. def getbtntype(msg)   
  2.   btns={["是否缴费","检查通过,是否继续","用户目前积分","确定要提交"]=>"pmd.button(:id,\"bunYes\").click",   
  3.     ["打印","对不起","错误信息","错误信息"]=>"pmd.button(:id,\"bunNO\").click",   
  4.     ["业务受理完成","操作成功"]=>"pmd.button(:id,\"bunOK\").click"  
  5.   }   
  6.   
  7.   btns.each do |k,v|   
  8.     if(k.is_a?(Array))   
  9.       k.each do |item|   
  10.         if(msg.index(item))   
  11.           return v   
  12.         end  
  13.       end  
  14.     else  
  15.       if msg.index(k)   
  16.         return v   
  17.       end  
  18.     end  
  19.   end  
  20.   return "   
  21.       if pmd.button(:id,\"bunOK\").exists?   
  22.       pmd.button(:id,\"bunOK\").click   
  23.     elsif pmd.button(:id,\"btnYes\").exists?   
  24.       pmd.button(:id,\"btnYes\").click   
  25.     elsif pmd.button(:id,\"btnNo\").exists?   
  26.       pmd.button(:id,\"btnNo\").click   
  27.   "   
  28.    
  29. end  
  30. eval getbtntype(msg)  

复制代码
经过一番,优化,现在已经把刚才复杂的函数化简成了,这个样子,从函数上看,非常清晰,如果再要增加相应的弹出窗口判断,也只要改那个hash对象就可以了。

论坛徽章:
0
2 [报告]
发表于 2010-12-26 07:48 |只看该作者
嗯,比较详细。

论坛徽章:
0
3 [报告]
发表于 2011-01-10 10:52 |只看该作者
嗯,比较详细。
2gua 发表于 2010-12-26 07:48



    我这都是浮云,谢谢瓜哥支持!

论坛徽章:
0
4 [报告]
发表于 2011-05-18 13:56 |只看该作者
回复 3# 中关村村草


   请问一下,如何获取网页弹出框的内容

论坛徽章:
0
5 [报告]
发表于 2011-05-18 14:18 |只看该作者
回复 4# suautotest


    哪有这么问问题的?

论坛徽章:
0
6 [报告]
发表于 2011-05-18 14:27 |只看该作者
回复  suautotest


    哪有这么问问题的?
2gua 发表于 2011-05-18 14:18



    版主,咋了?
我问的是正题啊,就是使用ruby点击某个按钮后,IE弹出的对话框,例如:提交表单时弹出的“确定要提交数据吗?”
我就是想要获取到这个弹出框的信息呢~

论坛徽章:
0
7 [报告]
发表于 2011-05-18 15:01 |只看该作者
回复 6# suautotest


    用JS实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP