Robotium的左右为难 -- enterText
最近测试框架收到反馈,详查后发现了一个Robotium的问题,甚有趣,遂记录。
问题场景:
Robotium.enterText输入数据后,点击"发送"按钮,多数情况下失败,少数时候成功。

问题分析:
这个问题不需要深入的分析流程,直接看enterText源码便可发现大概问题:
public void setEditText(final EditText editText, final String text) {
if(editText != null){
final String previousText = editText.getText().toString();
inst.runOnMainSync(new Runnable()
{
public void run()
{
editText.setInputType(InputType.TYPE_NULL); // 设置input类型,不重要
editText.performClick();
dialogUtils.hideSoftKeyboard(editText, false, false);
if(text.equals(""))
editText.setText(text);
else{
editText.setText(previousText + text);
editText.setCursorVisible(false); // …为什么text.equals("")就不需要呢setCursorVisible(false)呢?这TM在玩我吧......算了这个也不重要...
}
}
});
}
}
重点是performClick和hideSoftKeyboard。
1. 为什么Robotium要这么做呢?
如果不这么做,editText.setText(msg)也成功。但这和真实操作不一致,真实流程是:点击editText,弹出键盘,输入文字,隐藏键盘。虽然这个流程短,但状态变化很大:
(1)焦点发生变化,这可能会影响后续的检查/业务流程(触发事件之类…)。
(2)弹出/隐藏键盘,这会触发Android从Touch模式变为键盘模式。另外弹出/隐藏键盘可能有监听事件,如不触发操作,监听事件不会执行。
2. 为什么要在setText之前hideSoftKeyboard?
如果performClick和hideSoftKeyboard是上面的原因,那么hideSoftKeyboard在setText之前/后都没所谓了,因为他压根不影响输入。
3. 如果不执行hideSoftKeyboard会怎么样?
(1)隐藏键盘的监听事件不执行。
(2)Android将停留在键盘模式。
(3)最重要的是:不藏起来,键盘一直占了半个屏啊,Robotium要可视控件才能操作,弹出键盘可能会影响其他控件的操作。
这么说,Robotium在enterText的时候做performClick和hideSoftKeyboard是很合理的。
回到之前的问题,为什么它会导致“信息发送失败”呢?
因为:这个产品设计是,藏起键盘时,bottom_bar会回退到初始状态。如图:

bottom_bar初始状态时,是没有输入框和发送按钮的。先不管edit和btn有没被GC,光控件不可视,click操作就会失败。至于成功/失败随机,是因为hideSoftKeyboard事件响应和click速度参差造成的。
只能说这种应用场景下,Robotium表示无能为力。
解决方案:
1. 对Robotium进行扩展,实施额外enterText接口,但这会对日后升级Robotium带来不便。
2. 修改案例避免问题。
Robotium的左右为难 -- enterText的更多相关文章
- 转载:robotium typeText与enterText区别
solo.typeText和solo.enterText方法都可以对EditeText进行测试,达到的测试目的是一样的.存在几点不同: 1.实现上,typeText方法是robotium框架调用系统I ...
- robotium(及百度cafe)运行testcase之后程序挂起没有响应的原因调查及解决
一.问题背景 刚开始用的是百度cafe搭建的框架,已经用了一些版本,最后的test版本在7.4的apk上能跑,但是在最新发布的7.5的版本上跑不了,直接提示nullPointer错误,通过打日志的方式 ...
- 安卓自动化测试(2)Robotium环境搭建与新手入门教程
Robotium环境搭建与新手入门教程 准备工具:Robotium资料下载 知识准备: java基础知识,如基本的数据结构.语法结构.类.继承等 对Android系统较为熟悉,了解四大组件,会编写简单 ...
- Robotium编写测试用例如何模拟Junit4的BeforeClass和AfterClass方法2 - SingleLaunchActivityTestCase
本文来源于:http://blog.csdn.net/zhubaitian/article/details/39296753 在上一遍笔记博客中本以为只能在Setup和TearDown中做条件判断来实 ...
- Robotium编写测试用例如何模拟Junit4的BeforeClass和AfterClass方法1 - 条件判断法
本文来源于:http://blog.csdn.net/zhubaitian/article/details/39293883 Robotium的测试类ActivityInstrumentationTe ...
- Robotium自动化测试框架实用教程(图)
一.简介 Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击.长按.滑动等).查找和断言机制的API,能够对各 ...
- 转一篇老外写的博文:Android automated testing (Robotium)
Robotium的中文资料甚少,只得求助于老外,发现了一篇不错的文章:https://blog.codecentric.de/en/2011/03/android-automated-testing- ...
- 基于APK的Robotium登录人人网与发状态
搭建好Robotium的环境,大致就是下载安装jdk并配置环境变量,下载并打开Eclipse,下载安装Android SDK Tools并配置环境变量,下载安装ADT插件,创建并打开Android V ...
- Robotium简要学习
Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击.长按.滑动等).查找和断言机制的API,能够对各种控件进行 ...
随机推荐
- 深入研究C语言 第三篇
本篇研究TC2.0下其他几个工具.同时看看TC由源代码到exe程序的过程. 1. 用TCC将下面的程序编为.obj文件 我们知道,TCC在默认的编译连接一个C语言的源程序a.c的时候分为以下两步: ( ...
- windows配置thrift开发环境
1)安装thrift:到thrift官网下载exe文件,然后将文件重命名为thrift.exe,拷贝到c:\windows目录下(或者任何目录下),然后就可以在dos环境下使用了 c:\windows ...
- python第二天基础1-1
一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. if 1==1: name = 'wupeiqi' print name 二.三元运算 result = 值1 ...
- Cracking-- 17.13 将二叉树转换成双向链表
在书的105页 使用中根遍历的思想 left 之后 为 root 之后 为 right 则对左子树来说 left->right = root; root->left = left; 对右子 ...
- MVC的增删改和Razor
ASP.NET MVC中的增删改查 基本都要使用C控制器中的两个action来完成操作,一个用于从主界面跳转到新页面.同时将所需操作的数据传到新界面,另一个则对应新界面的按钮,用于完成操作.将数据传回 ...
- 国内及Github优秀开发人员列表
自从入了Android软件开发的行道,解决问题和学习过程中免不了会参考别人的思路,浏览博文和门户网站成了最大的入口.下面这些列表取名为:国内及Github优秀开发人员列表,就是浏览后的成果. 虽然下述 ...
- yii打印sql
想打印Sql的话,可以用把你要执行的命令例如queryAll(),queryOne(),execute()换成getRawSql(); 例如 : 要看$result = Yii::$app->d ...
- 通过挂载系统光盘搭建本地yum仓库
1,配置本地yum源: 把系统光盘挂载到文件夹aaa(aaa为自己创建的文件夹). [root@localhost /]# mount dev/cdrom /aaa 2,修改yum配置文件: yum的 ...
- DBCP配置数据库连接乱码问题
driverClassName = com.mysql.jdbc.Driver url = jdbc:mysql:///bigdata username = root password = 82371 ...
- Oracle数据库备份 expdp/impdp导出导入命令
使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用, ...