Robotium Robotium 专题 (三): 编写 Case 时用到的几个有用的方法

风吹麦浪 · 2014年12月05日 · 最后由 恒温 回复于 2016年09月08日 · 3992 次阅读
本帖已被设为精华帖!

本来今天想写下在有源代码的情况下,如何对应用进行自动化测试,但是今天活儿太多,就先不写了,可能很多同学都已经在网上搜到过相关的内容,包括在 Robotium 官方网站上也有看到过,所以,这里就简单说一下与 APP 控件相关的方法,便于利用控件 ID 进行操作。
1、通过控件 ID 点击打开 VIEW,这个方法在具体的使用中,我自己用的较多,只要知道了控件的 ID,就可以对控件进行操作,个人认为比较方便。如果有更好的方法,可以告诉我,一起学习下!

/* 通过ID点击打开VIEW
 * clickCtrlById(String s,int t)
 * s:Id(hierarchviewer)触摸按键的id,字符串格式
 * t:timedelay 触发按键后,停留多久(ms)
 * TARGET_PACKAGE_ID,是一个宏变量,字符串格式,定义了目标APK的包名
*/
 public int clickCtrlById(String s, int t )
 {
     int ctrl;
     View v;
     if( s == "")
     {
         return -1;
     }
     ctrl = solo.getCurrentActivity().getResources().getIdentifier(s,"id","com.leju.platform");
     v = solo.getView(ctrl);
     solo.clickOnView(v);
     solo.sleep(t);        
     return 0;
 }

2、知道了文本框 ID 后,可以通过下面的方法,直接在文本框中填写相应的数据,我认为这个方法比直接使用 solo.entext(int index,String text) 这种方式要好很多。

/* 通过ID输入文本内容
 * enterTextById(String id,String s,int t)
 * id:Id(hierarchviewer)获取的文本框id,字符串格式id
 * s:需要输入的文本信息
 * t:timedelay 触发按键后,停留多久(ms)
*/
public int enterTextById(String id,String s,int t)
 {
     int ctrl;
     EditText v;

     if( s == "")
     {
         return -1;
     }

     ctrl=solo.getCurrentActivity().getResources().getIdentifier(id,"id",solo.getCurrentActivity().getPackageName());
     v=(EditText)solo.getView(ctrl);

     solo.enterText(v,s);
     solo.sleep(t);
     return 0;

 }

还有一些其他方法,等后面有时间再写上来。可能有些方法大家都已经用到过,我在这里写出来的原因主要是想把一些好的方法分享一下,顺便也记录一下,如果发现写的有问题,请大家一定要指正出来,我会认真修改的!
我个人认为,未来自动化还是有一定用处的,现在可能只是对 robotium 关注多一些,将来也会对其他的自动化工具做一些研究,也会写出来,我觉得做任何一种职业,态度是非常重要的,如果总是觉得测试没有地位,没有前途,那么转行做其他的就会有地位,有前途?地位和前途,都是靠自己的能力和努力来积累的,有些时候测试之所以没有地位,主要还是在于做测试的人,所以,对于咱们这些测试人员,一定要对自己有信心,无论开发多么牛逼,都需要测试去找出他们的问题,在开发和产品面前,该强势的时候一定要强势,不能总是因为觉得测试的地位不好,而忽略掉本该有的立场!

共收到 22 条回复 时间 点赞

赞。 多贡献这些小而美的文章把

赞,下次我也把我的工具类分享出来

#2 楼 @shixue33 说来也巧, @bill 之前一度是当天浏览论坛页面最多的人. 所以当时我就对他特别留意了. 果然现在进步很快啊.

很实用 很好

赞一个,关于 robotium 的基础概述的很详细,值得学习~

#6 楼 @shixue33
#5 楼 @bh01251859
#3 楼 @seveniruby
#4 楼 @sunflower_minmin
呵呵,谢谢各位!昨天忙了一天,有产品上线,没来这里,谢谢各位的赞,想让这个论坛发展壮大,需要大家的一起努力啊!多分享好的东西,让更多的人来访问和查找想要的资料!

不是直接可以 solo.getView(String id) 吗 为什么要转换成 int

#1 楼 @seveniruby 思寒,精辟!

#8 楼 @uncle_mm 这个 int 只是个返回值的类型,跟转换没关系。

#10 楼 @bill ctrl = solo.getCurrentActivity().getResources().getIdentifier(s,"id","com.leju.platform"); 这步的意思是什么呢,ps 刚接触,所以可能问的问题不叫愚蠢

#11 楼 @uncle_mm 呵呵,这个问题一点都不愚蠢,我觉得不管是新手还是大牛,只要有不明白的,都可以问,这样才能学到东西!solo.getCurrentActivity().getResources().getIdentifier(s,"id","com.leju.platform") 这个方法的意思主要是获取资源 ID,getIdentifier(s,"id","com.leju.platform") 中第一个参数是 ID 名,第二个参数是资源属性 ID 或者是 Drawable,第三个参数是包名。

#12 楼 @bill 那资源 ID 不是 R 文件中 int 类型的 id 吗? 我的意思是 solo.getView(String id) 和 solo.getView(int id) 你为什么选择了后者啊

#13 楼 @uncle_mm 这个还是回到之前你问的那个 int 返回值了,我说过,int 返回值仅仅是个返回类型,我也可以定义成 boolean 类型的;现在我跟你解释为什么我要用这种方法,因为在 robotium 中 api 中不提供使用 id 的方式,如果我们想在 robotium 中使用 id 就需要自己通过 id 来找到控件的实例,然后通过 robotium 的 api 对实例进行操作来达到目的,当然也可以自己做封装,如我写的方法那样!这个问题你就不用再纠结了,你可以按你的方法试试,如果不行,再用我的方法!

#14 楼 @bill 我看了一下源码 api 自身提供的 getView(String id) 的实现 最终还是调用了 getView(int id) 的方法; 我说的 int 不是 return 的 0 啊 是 ctrl ... ; 嗯嗯 了解你说的意思了。

#15 楼 @uncle_mm 抱歉,刚没看清你的意思,我再给你解释下,在白盒测试(拿到项目代码的情况)中,我们可以直接使用 R.id 的形式来调用:View view=solo.getView(R.id.btn_Example);//获取 View
solo.clickOnView(view);//点击;但是在只知道 APP 的情况下,R.id 不可见,所以我只能把 ctrl 定义成 int 类型的,然后再使用 getView(int id) 的方法来得到想要的 view!不知道这么解释是否能明白?

#16 楼 @bill 嗯嗯 我猜测你也是因为没有源码才这么干的。网上以前的例子都是通过这个 solo.getCurrentActivity().getResources().getIdentifier(s,"id","com.leju.platform") 方法来获得 int id 再点。不过现在 API 自身提供了可以使用的 getView("btn_Example") 直接来操作了。就是 Robotium 自身封装了这个方法。不过,我也没测试过,没有源码的时候这个方法能不能正常使用。

@monkey 有没有遇到过用 typeText 方法在 EditText 中输入会失败,只能用 enterText 来输入,是什么原因呢?
看多 robotium 里的源码,没看懂这两个方法的区别,求指导。

目前我这里针对 4.0 以上版本,全部用 id 进行定位操作的。跟你讲的那些一样,你说有些遗漏,不过底层的已经暴漏了,这就可以了。

不是可以直接在 uiautomationviewer 里面找到 resource-id 的吗

但前提是要知道控件的 string ID 吧,我觉得 solo.getView(String id) 这个更方便点啊,可能我没理解你的用意

恒温 [该话题已被删除] 中提及了此贴 09月08日 18:41
恒温 《Robotium 专题》 合集 中提及了此贴 12月02日 18:24
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册