Appium和Robotium在文字输入上的区别
近来在学习研究移动平台 自动化测试时发现Appium和Robotium在对文本框进行输入时有一定的区别:
Appium在输入文字时需要调用系统键盘
Robotium在输入文字是根本不需要调出键盘,文字很快速的就输入完成,感觉不是输入的,而是Copy&Paste
我个人认为造成这种区别的原因应该如下(源码分析验证:TBD):
Appium是基于UIAutomator框架实现的。Appium测试进程与目标应用进程是分开的,所以Appium不能直接访问目标应用的各种element属性进行copy&paste,而只能模拟触发相应的事件对目标应用进行操作。这就好比触摸屏监控驱动和目标应用的关系:驱动监控到用户点击屏幕的事件后,驱动就会去判断点击的位置是否是一个文本框,如果是的话,就去打开系统键盘给用户进行输入。
Robotium是基于Instrumentation框架的。Robotium测试进程与目标应用是在同一个进程中作为两个不同的线程运行的。也就是说Robotium测试线程是有办法直接访问目标应用的各种element属性的,所以它根本不需要触发任何事件,直接就可以在内部修改相应的数据,比如这个例子中的文本框输入文字。
那么单单针对文本输入来说,Robotium和Appium优劣如何呢?我个人认为可以从以下几点出发进行考虑:
Robotium是直接Copy&Paste,所以效率当然会更高,特别是在长字符串输入的时候,比如,输入一篇文章,如果在Appium上调用键盘,特别当你的安卓设别性能不高的情况下,你会明显感觉到卡卡的。
Robotium因为不需要调出键盘,所以很容易就能输入各种不同语言;而Appium就不一样了,如果当前英文而你需要输入中文,那么你要去调用系统setting的应用先去把语言设置成中文,选择中文输入法等,然后再切换到目标应用进行输入操作。
Appium更能模拟用户的行为操作;而Robotium偏向测试金字塔更底层点的Unit Test(所以Robotium除了能支持测试目标应用的Activity外,还能测试Content Provider等)
转载
英语音标 /ɪ/ 应该怎么读?
/ɪ/ 是短元音,舌位中高而前,牙床半合,不圆唇。发音要领如下:
一、舌尖靠近下齿,舌前部抬高,舌位中高,不发生任何摩擦。
二、打开上下唇和牙齿,嘴角向两边拉伸,成扁平状,牙床半合,上下齿之间的距离相当于一个小指尖的长度。
三、嘴角向两边拉伸,成扁平状。
四、小舌肌肉紧张,声带振动,短促而轻快地发出这个音。
在美国英语里,这个音又称为short i sound,因为它是元音字母i的短音:
lick 舔
six 六
bib 围嘴儿
pig 猪
pin 别针
kiss 亲吻
ink 墨水
hill 小山
taxi 出租汽车
chilli 辣椒。
学习软件测试,会用到哪些工具,QTP这种的?
会用到很多工具,给你简单列了一下
1、单元测试工具
Junit
Testng(功能比junit要强大一些)
Jmeter(适合功能及性能测试)
2、接口测试工具
soapui
httpClient
3、UI自动化测试工具
QTP(含有多种插件,适用范围广,可进行C/S、B/S系统的测试)
Selenium(web系统)
RFT(IBM工具,收费)
4、移动APP自动化测试工具
robotium
Monkey
Appium
5、测试管理工具
QC
JIRA
TESTLINK
BUGZILIIA
关于robotium中的webelement获取网页元素,通过js怎么去获取
robotium框架支持WebView,在robotium中有getWebElements()、getWebElements(By by)等方法来获取android中的WebView的元素,并提供了 clickOnWebElement方法来完成点击事件.android中的原生控件是比较好攻取的,那么对于WebView这个框架是怎么获取的呢。
第一步:利用JS获取页面中的所有元素
在PC上,获取网页的元素可以通过注入javascript元素来完成,以Chrome浏览器为例,打开工具——JavaScript控制台(快捷方式:Ctrl+Shift+J),输入 javascript:prompt(document.URL)即会弹出含当前页面的URL的提示框,因此通过编写适当的JS脚本是可以在这个弹出框中显示所有页面元素的。RobotiumWeb.js就是此功能实现用的JS脚本。以solo中getWebElements()为例,
[java] view plaincopy
public ArrayList getWebElements(boolean onlySufficientlyVisible){
boolean javaScriptWasExecuted = executeJavaScriptFunction("allWebElements();");
return getWebElements(javaScriptWasExecuted, onlySufficientlyVisible);
}
[java] view plaincopy
private boolean executeJavaScriptFunction(final String function){
final WebView webView = viewFetcher.getFreshestView(viewFetcher.getCurrentViews(WebView.class, true));
if(webView == null){
return false;
}
//做一些JS注入执行前的准备工作,例如将WebView设为可允许执行JS等,并将RobotiumWeb.js中的脚本以String形式返回
final String javaScript = prepareForStartOfJavascriptExecution();
activityUtils.getCurrentActivity(false).runOnUiThread(new Runnable() {
public void run() {
if(webView != null){
webView.loadUrl("javascript:" + javaScript + function);
}
}
});
return true;
}
可以看出这个方法执行的是allWebElements();函数,即类似执行RobotiumWeb.js文件中如下JS代码片段:
可以把如下片段放到JavaScript控制台中看效果
[javascript] view plaincopy
javascript:
function allWebElements() {
for (var key in document.all){
try{
promptElement(document.all[key]); //调用promptElement(element)函数
}catch(ignored){}
}
finished(); //执行完后,调用finished()函数
}
function promptElement(element) {
var id = element.id;
var text = element.innerText;
if(text.trim().length == 0){
text = element.value;
}
var name = element.getAttribute('name');
var className = element.className;
var tagName = element.tagName;
var attributes = "";
var htmlAttributes = element.attributes;
for (var i = 0, htmlAttribute; htmlAttribute = htmlAttributes[i]; i++){
attributes += htmlAttribute.name + "::" + htmlAttribute.value;
if (i + 1 < htmlAttributes.length) {
attributes += "#$";
}
}
var rect = element.getBoundingClientRect();
if(rect.width > 0 && rect.height > 0 && rect.left >= 0 && rect.top >= 0){
prompt(id + ';,' + text + ';,' + name + ";," + className + ";," + tagName + ";," + rect.left + ';,' + rect.top + ';,' + rect.width + ';,' + rect.height + ';,' + attributes); //弹出包含id、text、name等字段的提示框
}
}
function finished(){
prompt('robotium-finished'); //弹出包含robotium-finished字符串的提示框,用于标识脚本注入执行结束
}
从脚本中可以看出JS获得页面元素后还进行了一定的格式化处理,在每个元素之间加了;,符号,这也是为了在后面代码中更加方便地解析。脚本的最后调用了finished()函数,即弹出包含robotium-finished的提示框。这一步完成了页面元素的获取,那么提示框中包含的内容在Android中怎么获取呢?
第二步:在Android中获取WebView中prompt提示框中的信息
在Android的Webkit包中有个WebChromeClient类,这个类中的onJsPrompt方法就是用于处理WebView中的提示框的,当WebView中有JS提示框时,会回调该方法,String message参数将包含提示框中的信息,因此robotium写了个继承自WebChromeClient类的RobotiumWebClient类。覆写了onJsPrompt
onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)
[java] view plaincopy
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult r) {
if(message != null && (message.contains(";,") || message.contains("robotium-finished"))){
//如果提示框中包含robotium-finished字符串,即表示那段JS注入脚本执行完毕了
if(message.equals("robotium-finished")){
webElementCreator.setFinished(true);
}
else{
webElementCreator.createWebElementAndAddInList(message, view);//有人提示框中的内容,那么就可以对提示框中的内容进行处理了
}
r.confirm();
return true;
}
else {
if(originalWebChromeClient != null) {
return originalWebChromeClient.onJsPrompt(view, url, message, defaultValue, r);
}
return true;
}
}
另外,原本的WebView默认是不允许执行JS的,因此需要先执行enableJavascriptAndSetRobotiumWebClient方法。将JavaScriptEnabled设置为true,将将WebChromeClient设置为robotiumWebClient
[java] view plaincopy
public void enableJavascriptAndSetRobotiumWebClient(List webViews, WebChromeClient originalWebChromeClient){
this.originalWebChromeClient = originalWebChromeClient;
for(final WebView webView : webViews){
if(webView != null){
inst.runOnMainSync(new Runnable() {
public void run() {
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(robotiumWebClient);
}
});
}
}
}
第三步:将提示框中的消息存入WebElement Java bean中
获取到了prompt提示框中的消息后,接下来就是对这些已经过处理含特殊格式的消息进行解析处理了,依次得到WebElement的id、text、name等字段。
robotium 怎么获取控件的index
在robotium中api中不提供使用id的方式。
如果想在robotium中使用id就需要自己通过id来找到控件的实例,然后通过robotium的api对实例进行操作来达到目的。
当然了。如果有兴趣也可以自己将这个封装起来以便使用。
在说方法之前,先说说id的几种形式:
1.字符串形式。例如id/btn_Example在源码的布局里面写的,HierarchyView中看见的,都是这种。
2.数字形式。例如0x7f070012,可以打开R.java。里面就体现了String形式和int形式的对应关系。
在白盒测试中,可以直接使用R.id的形式来调用:
Java code
View view=solo.getView(R.id.btn_Example);//获取View
solo.clickOnView(view);//点击
常用的软件测试自动化工具有哪些
1、测试类型可以包括:白盒测试、黑盒测试(功能测试、性能测试)等。
2、不同的测试类型使用的自动化测试方法不同,白盒测试主要针对代码级的单元测试、黑盒测试主要面对功能级和系统级的验证测试。
3、自动化测试,针对白盒测试,一般需要有一定的编程基础,即能够基于功能代码写测试代码,常用的单元测试方面的自动化测试工具很多,上网一搜全是。
4、自动化测试,针对功能测试,有几种情况,基于CLI、API和GUI的测试;基于CLI、API的测试,即应用脚本技术向设备模拟发送CLI命令或者API请求,以达到控制设备的效果。基于GUI功能测试,即应用传统的界面自动化测试工具(例如:RFT、QTP等)控制界面控件操作的方法,以达到模拟用户操作,这几种方式都需要你有一定的编码基础;基于CLI、API的需要你懂脚本技术(例如:tcl、python、ruby等),RFT需要你懂java或者.net、QTP需要VB等。
自动化测试工具有哪些
自动化测试工具有如下几种:1、WinRunnerMercury Interactive公司的WinRunner是一种企业级的功能测试工具,用于检测应用程序是否能够达到预期的功能及正常运行。通过自动录制、检测和回放用户的应用操作,WinRunner能够有效地帮助测试人员对复杂的企业级应用的不同发布版进行测试,提高测试人员的工作效率和质量,确保跨平台的、复杂的企业级应用无故障发布及长期稳定运行。企业级应用可能包括Web应用系统,ERP系统,CRM系统等等。2、Rational Robot是业界最顶尖的功能测试工具,它甚至可以在测试人员学习高级脚本技术之前帮助其进行成功的测试。它集成在测试人员的桌面IBM Rational Test Manager上,在这里测试人员可以计划、组织、执行、管理和报告所有测试活动,包括手动测试报告。这种测试和管理的双重功能是自动化测试的理想开始。3、AdventNet QEngineAdventNet QEngine是一个应用广泛且独立于平台的自动化软件测试工具,可用于Web功能测试、web性能测试、Java应用功能测试、Java API测试、SOAP测试、回归测试和Java应用性能测试。支持对于使用HTML、JSP、ASP、.NET、PHP、JavaScript/VBScript、XML、SOAP、WSDL、e-commerce、传统客户端/服务器等开发的应用程序进行测试。此工具以Java开发,因此便于移植和提供多平台支持。4、SilkTest是业界领先的、用于对企业级应用进行功能测试的产品,可用于测试Web、Java或是传统的C/S结构。SilkTest提供了许多功能,使用户能够高效率地进行软件自动化测试。这些功能包括:测试的计划和管理;直接的数据库访问及校验;灵活、强大的4Test脚本语言,内置的恢复系统(Recovery System);以及具有使用同一套脚本进行跨平台、跨浏览器和技术进行测试的能力。5、QA RunQARun的测试实现方式是通过鼠标移动、键盘点击操作被测应用,即而得到相应的测试脚本,对该脚本可以进行编辑和调试。在记录的过程中可针对被测应用中所包含的功能点进行基线值的建立,换句话说就是在插入检查点的同时建立期望值。在这里检查点是目标系统的一个特殊方面在一特定点的期望状态。通常,检查点在QARun提示目标系统执行一系列事件之后被执行。检查点用于确定实际结果与期望结果是否相同
如何搭建基于robotium的测试平台
Robotium 是一个基于Android 应用程序的自动化黑盒测试工具。它简化了测试用例的编写,并且能够编写出功能强大,健壮性很强的黑盒测试用例。运用Robotium,测试人员能够编写测试用例,系统测试,验收测试方案等。同时Robotium 还能够跨越多个Android 的Activity,进行测试。
Robotium 对Activity,Dialog,Toast,Menu 都是支持的。