利用UiAutomator写一个自动遍历渠道包关键功能的脚本
来源:互联网 发布:吸毒到底有多恐怖 知乎 编辑:程序博客网 时间:2024/06/07 01:42
本人在做自动化测试的过程中,出现了一个需求。原因是,在发出去的渠道包里面,偶然一次有两个渠道包微博登录失败的bug,所以想着利用UiAutomator写了一个自动遍历每个渠道包的登录方式的脚本。经过尝试第一版终于完成,分享代码和思路,供大家参考。
思路:把所有渠道包放在一个apk的文件夹里面。写好代码打包成jar包,先push到手机中,然后再导出一个jar包,再这个包里用命令执行UiAutomator脚本。输出结果并保存日志在当前目录下。
下面是放在电脑上的jar包程序入口所在的类的代码:
package happyjuzi;import java.io.File;import source.Common;public class Script extends Common {public static void main(String[] args) {Script script = new Script();script.testDemo();}public static Script getInstance() {return new Script();}public void testDemo() {String home = getWorkSpase();//获取当前路径output(home);File file = new File(home + "/apk");// File file = new File("/Users/dahaohaozai/Desktop" + "/apk");File[] file2 = file.listFiles();for (int i = 0; i < file2.length; i++) {File apk = file2[i];String path = apk.getAbsolutePath();for (int k = 0; k < 4; k++) {output(apk.getName(), i + 1);execCmd(ADB_PATH + "adb uninstall com.happyjuzi.apps.juzi");execCmd(ADB_PATH + "adb install " + path);execCmd(ADB_PATH + "adb shell uiautomator runtest demo.jar --nohup -c happyjuzi.AppTest#testTest" + k);}}}}下面是自己调试类的代码,暂且把需要运行的方法直接写在这里了,如果你也要写脚本,不建议这么做。
package happyjuzi;import java.io.IOException;import java.sql.SQLException;import java.text.ParseException;import com.android.uiautomator.core.UiObjectNotFoundException;import android.os.RemoteException;import source.UiAutomatorHelper;@SuppressWarnings("deprecation")public class AppTest extends AppCase {public static String jarName, testClass, testName, androidId;public static void main(String[] args)throws ClassNotFoundException, SQLException, InterruptedException, IOException, ParseException {jarName = "demo";testClass = "happyjuzi.AppTest";testName = "testTest0";// Script.getInstance().testDemo();// PerformanceThread.getInstance().start();//启动线程new UiAutomatorHelper(jarName, testClass, testName);// 调试用例// PerformanceThread.key = false;//结束线程}public void testTest0() throws InterruptedException, IOException, UiObjectNotFoundException, RemoteException {startJuziApp();skipGuideage();login(0);checkIsLogin();}public void testTest1() throws InterruptedException, IOException, UiObjectNotFoundException, RemoteException {startJuziApp();skipGuideage();login(1);checkIsLogin();}public void testTest2() throws InterruptedException, IOException, UiObjectNotFoundException, RemoteException {startJuziApp();skipGuideage();login(2);checkIsLogin();}public void testTest3() throws InterruptedException, IOException, UiObjectNotFoundException, RemoteException {startJuziApp();skipGuideage();login(3);checkIsLogin();}}下面是这三个封装方法的代码:
/** * 跳过引导页 * * @throws IOException * @throws InterruptedException * @throws UiObjectNotFoundException */public void skipGuideage() throws IOException, InterruptedException, UiObjectNotFoundException {startJuziApp();waitForUiObjectByResourceId("com.happyjuzi.apps.juzi:id/btn_skip");swipeLeft();swipeLeft();waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/btn_start");sleep(5000);if (getUiObjectByResourceId("com.happyjuzi.apps.juzi:id/close").exists()) {waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/close");}}/** * 登录 * * @param key * 选择登录方式 * @throws UiObjectNotFoundException */public void login(int key) throws UiObjectNotFoundException {switch (key) {case 0:waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/btn_profile");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/avatar_default_view");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/wx_view");waitForUiObjectByResourceId("com.happyjuzi.apps.juzi:id/protrait_item_main");break;case 1:waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/btn_profile");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/avatar_default_view");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/qq_view");sleep(5000);if (getUiObjectByResourceId("com.tencent.mobileqq:id/name").exists()) {clickPiont(500, 1820);}waitForUiObjectByResourceId("com.happyjuzi.apps.juzi:id/protrait_item_main");break;case 2:waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/btn_profile");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/avatar_default_view");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/sina_view");sleep(5000);if (getUiObjectByResourceId("com.sina.weibo:id/bnLogin").exists()) {waitForResourceIdAndClick("com.sina.weibo:id/bnLogin");}waitForUiObjectByResourceId("com.happyjuzi.apps.juzi:id/protrait_item_main");break;case 3:waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/btn_profile");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/avatar_default_view");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/phone_view");writeTextByResourceId("com.happyjuzi.apps.juzi:id/phone_num_view", "******");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/next_view");writeTextByResourceId("com.happyjuzi.apps.juzi:id/pwd_view", "*****");waitForResourceIdAndClick("com.happyjuzi.apps.juzi:id/next_view");waitForUiObjectByResourceId("com.happyjuzi.apps.juzi:id/protrait_item_main");break;default:break;}}/** * 检查是否登录成功 */public void checkIsLogin() {if (getUiObjectByText("点击头像登录").exists()) {outpu("登录失败!");} else {output("登录成功!");}}
由于时间比较紧,所以封装做得不够好,注释也少。先看看实际效果后期再改进,毕竟需求是会不断变化的。
导出jar包的时候,如果是Mac运行jar包,一定要修改里面ADB_PATH地址,不然会报错。具体导出jar包文件的办法,博客里上一篇帖子就是。
阅读全文
0 0
- 利用UiAutomator写一个自动遍历渠道包关键功能的脚本
- 利用UiAutomator写一个首页刷新的稳定性测试脚本
- 利用UiAutomator和httpclient写自动发表笑话到微信朋友圈功能
- 写一个ping 包的脚本
- 写一个自动备份的脚本
- 自动打渠道包的shell命令
- 自动打渠道包的shell命令
- android uiautomator写一个崩溃的监听
- 【script】一个打渠道号的脚本
- 利用SecureCRT的脚本功能自动定时执行任务
- 利用pyGTK写一个简单的脚本GUI
- Android ant自动打包脚本:自动替换友盟渠道、版本号、包名
- Android ant 自动打包脚本:自动替换友盟渠道、版本号、包名
- Android ant自动打包脚本:自动替换友盟渠道、版本号、包名
- Android ant自动打包脚本:自动替换友盟渠道、版本号、包名
- 写一个python脚本,实现简单的http服务器功能:
- 用shell写了一个自动编译代码的脚本
- 用shell写了一个自动编译代码的脚本
- caioj·1070 动态规划入门(二维一边推3:字符距离)
- HTML部分基础总结(7)
- jdk环境变量配置-Windows平台
- 真●总结
- poj3278 抓牛(bfs)
- 利用UiAutomator写一个自动遍历渠道包关键功能的脚本
- 理解虚拟机中的四种网络连接方式
- Java 核心技术第十版 中文 卷1 怎样解压“分卷”的压缩文件
- 网站管理助手开设的网站打开出错“您未被授权查看该页”
- 分拆素数和
- Tensorflow学习笔记2:About Session, Graph, Operation and Tensor
- MPI的拓扑(虚拟拓扑和笛卡尔拓扑)
- KVC和KVO底层原理
- 坑一 执行多线程时多次执行CPU满负荷