案例1——汽车之家
在eclipse里使用对应的考试(或练习)秘钥登录并下载题目之后,打开项目的Main.java文件,接下来将在test函数里编写测试脚本。
下面我们将以汽车之家为例,讲解如何依据题目的测试需求来编写一个能获得高分的脚本。
测试需求中第一条测试需求如下:
首先要打开Uiautomator Viewer工具来获取我们要测试的控件的定位参数,该工具的介绍和具体使用参考帮助文档/脚本编写要求
使用该工具获取应用启动的主页面,如下图
我们会发现,主页面上有一个弹窗,而这并不在我们需要测试的范围之内,所以我们要关
这个弹窗。在上图工具中可以看到弹窗关闭按钮没有id
所以有下面这行代码用于XPath定位按钮并点击关闭该弹窗
driver.findElementByXPath("//android.widget.TextView[@text='不再提醒']").click();
关闭弹窗之后再次用工具分析当前页面,如下图
可以看到我们测试范围内(上图用蓝色框圈出的部分)的菜单栏的详细控件信息,但通过
对比我们发现,“推荐”、“金融、“原创”等菜单栏控件的id都为上图中的
com.cubic.autohome:id/ah_common_text_badge
而根据控件定位参数的唯一性原则,可知我们此处不能使用id来定位控件,考虑使用xPath来定位,而根据上图中的控件参数我们可以知道,“推荐”菜单栏控件对应的xPath应该为
android.widget.TextView[@text='推荐']
所以我们应该用下面的语句来定位并点击测试该控件
driver.findElementByXPath("//android.widget.TextView[@text='推荐']").click();
同理,“金融”、“原创”等菜单栏控件也用此类方法来定位并进行点击测试。但在测试过程中发现该菜单栏还有其他滑动之后才能显示的栏目,于是使用了Appium API中的一个Swipe方法实现了一个简单的左滑方法如下:
public void swipeRight2Left(AppiumDriver driver){
int startx = 510;
int starty = 161;
int endx = 30;
int endy = 161;
driver.swipe(startx, starty, endx, endy, 500);
}
其中滑动的起始和终止X、Y坐标分别来自“视频”和“推荐”控件的bounds属性。如下
安卓布局中每个控件都是一个矩形,bounds属性中两个坐标分别是矩形左上角和右下角。
不过这种用坐标的方式实现滑动的弊端在于换一个分辨率的设备脚本就可能执行失败,更优雅的做法是获得屏幕宽高后动态计算出滑动的坐标,依赖以下两个方法,具体实现不做赘述
driver.manage().window().getSize().width;
driver.manage().window().getSize().height;
接下来看到上图底部我们需要测试的菜单栏,通过查看底部菜单栏控件信息,发现其id都是唯一的,比如“首页”这个控件的id就为
com.cubic.autohome:id/article_main_RadioButton
而“论坛”这个控件的id为
com.cubic.autohome:id/club_main_RadioButton
其他的底部菜单栏控件id经过查看也各不相同,所以这里我们可以使用id来定位这些控件。
于是对于底部菜单栏我们用如下语句进行点击测试
driver.findElementById("com.cubic.autohome:id/article_main_RadioButton").click();
driver.findElementById("com.cubic.autohome:id/club_main_RadioButton").click();
driver.findElementById("com.cubic.autohome:id/car_main_RadioButton").click();
driver.findElementById("com.cubic.autohome:id/find_main_RadioButton").click();
driver.findElementById("com.cubic.autohome:id/owner_main_RadioButton").click();
接下来看到测试需求中的第二条要求如下:
所以查看主页面上搜索框的控件信息,如下
这里看到其id是com.autohome.main.article:id/search_box,我们看到需求中还说明要输入“特斯拉”进行搜索,但是注意,上图主页面中的搜索框控件的class是android.widget.RelativeLayout,而可以输入文字的搜索框的class应该是android.widget.EditText。
所以这里不能直接对这个搜索框控件输入文字,而要先点击一下该控件进入真正的搜索页面,如下图
此时,可以看到这个页面的搜索框才是真正可以输入内容的搜索框,在此输入“特斯拉”并进行搜索。
上述两个步骤的具体代码如下
driver.findElementById("com.autohome.main.article:id/search_box").click();
driver.findElementById("com.autohome.plugin.search:id/fragment_search_keyword_autocompleteview").sendKeys("特斯拉");
driver.sendKeyEvent(AndroidKeyCode.ENTER);
至此一道试题的脚本编写,就已基本完成,接下来启动Appium Server并连接测试设备后,尝试运行脚本,确保脚本能正常运行后使用插件进行运行打分并提交。
其中在运行过程中,依据不同的设备可能会出现不同的权限弹窗(如应用请求获取位置信息等),这类测试过程中出现的问题,请在脚本中自行加入判断处理。
完整示例代码请参考Qiche.java。
案例2——快图浏览
案例1已详细说明了移动应用自动化测试题的脚本编写逻辑,案例2直接附上高分脚本PicFolder.java,参考案例2的测试需求,并严格按照脚本编写要求即可快速掌握如何编写满足试题要求的高分脚本。
补充
由于脚本在调试测试过程中可能会执行失败导致报错,插件对于运行出错的情况不会评分上传,可以在脚本外加一个try catch 块,但catch中不要打印stackTrace,这样即使运行出错插件也能对脚本已经测试过的范围进行评分上传。