利用UiAutomator写一个自动遍历渠道包关键功能的脚本

原创 2017年11月04日 10:04:30

本人在做自动化测试的过程中,出现了一个需求。原因是,在发出去的渠道包里面,偶然一次有两个渠道包微博登录失败的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包文件的办法,博客里上一篇帖子就是。



AppCrawler 自动遍历工具结合LeakCanary检查内存泄露

使用思寒大神开发的AppCrawler,自动遍历工具来测试内存泄露,遍历控件同时检查可能的内存问题 AppCrawler参考地址:https://testerhome.com/topics/56...
  • jinyu1201
  • jinyu1201
  • 2016-08-10 17:53:54
  • 268

SmartMonkey--UI遍历

前言 业界常用Android SDK中的Monkey长时间频繁快速的对app界面进行各种操作,从而检测app的稳定性,辅助手工测试人员发现不易发现的问题。然而,这种方式对界面元素的操...
  • yangxin09
  • yangxin09
  • 2016-09-20 23:43:16
  • 1670

遍历安装某个路径下的所有apk文件

@echo off del list.txt 2>nul for /R %%s in (.,*) do ( echo %%s>>list.txt ) for /f %%i in (list.txt)...
  • g19920917
  • g19920917
  • 2014-09-25 16:25:22
  • 921

android UiAutomator如何利用adb install和adb uninstall实现安装和卸载

本人在看android UiAutomator快速调试的代码时,突然想到一个问题,既然能实现运行cmd命令,那写一个能实现快速调试安装和卸载的方法就挺好的,方便快捷,一键实现自己想要的功能。经过不断尝...
  • Fhaohaizi
  • Fhaohaizi
  • 2017-02-21 19:21:15
  • 714

uiautomator中踩过的坑

String szItem = m_softwareItems.get(nIndex); UiObject item = softwareItems.getChildByText(n...
  • yongshi6
  • yongshi6
  • 2016-06-20 09:29:55
  • 1631

使用uiautomator的python封装进行android的UI测试

原文章链接:https://my.oschina.net/yangyanxing/blog/498403 最近项目中有个需求要在至少100台手机上对应用进行兼容性测试,首先想到的就是自动化来操作,不...
  • qq_26608937
  • qq_26608937
  • 2017-03-01 15:07:05
  • 1522

UiAutomator中android.widget.ListView控件的子元素遍历

网上对于UiAutomator大都是简单demo的讲解,许多实用的技巧没有贴出来。今天介绍几个自己琢磨出来的技巧 1.android.widget.ListView控件的子元素遍历 对于一些列表控件,...
  • yongshi6
  • yongshi6
  • 2016-04-01 23:37:37
  • 4426

uiautomator中UiObject中getChildCount和getChild方法解惑

问题描述 getChildCount得到的子节点数是当前节点的下一层的控件数,不包括子节点的子节点。但是用getChild(UiSelector)中遍历控件的时候,把当前节点的子子孙孙全部遍历一遍...
  • qhshiniba
  • qhshiniba
  • 2014-04-19 15:49:36
  • 6427

android UiAutomator获取当前页面某类控件个数的方法

本人在学习UiAutomator的时候,发现一个问题,就是我需要知道当前班级作业的个数,本来想用getchildCount(),发现原来是按行的,一行不一定有多少个小题,后来就想了一个办法,selen...
  • Fhaohaizi
  • Fhaohaizi
  • 2017-04-18 14:43:28
  • 1112

如何遍历需要测试的按键

//1.初始化定义mkeyMap = new HashMap //2.填充键值 mKeyMap.put(KeyCode,id); //3.按键响应事件中 检查keycode 检查...
  • newtonnl
  • newtonnl
  • 2016-06-20 19:09:50
  • 672
收藏助手
不良信息举报
您举报文章:利用UiAutomator写一个自动遍历渠道包关键功能的脚本
举报原因:
原因补充:

(最多只允许输入30个字)