背景

由于我们这边正在进行 app 自动化工具选型,目前暂定选用 macaca,但 macaca 存在没有无线测试连接方案,后来在论坛上看到 @codeskyblue 开源的 atx-agent 方案,非常感兴趣,然后花了 2 天功夫看了相关的几块源码,由于只有 python 版本的 atx-cli,因此考虑 写个 java 版 atx-cli

从开始写到现在还不到一个星期,现在开源出来主要考虑,有兴趣的小伙伴可以一起写下

目前已实现

初始化: @Before

public void setUp() throws Exception{

DesiredCapabilities desiredCapabilities = new DesiredCapabilities();

desiredCapabilities.setPackageName("com.netease.cloudmusic");

desiredCapabilities.setRemoteHost("192.168.2.81");

driver.initDriver(desiredCapabilities);

}

目前元素查找实现以下方法:

elementByName driver.elementByName("私人FM").click();

elementByDesc driver.elementByDesc("转到上一层级").click();

elementById driver.elementById("com.netease.cloudmusic:id/search_src_text").sendKeys(keys);

elementByMult

一个元素多个属性定位

Map songParams = new HashMap();

songParams.put(MaskNum.TEXT_STARTS_WITH.getDes(),"搜索");

songParams.put(MaskNum.CLASS_NAME.getDes(),"android.widget.TextView");

driver.elementByMult((songParams)).click();

elementByXpath

在原方法不支持 xpath 基础上增加 xpath 的支持

String xpath = "//*[@resource-id=\"com.netease.cloudmusic:id/gt\"]/*[@class=\"android.widget.LinearLayout\"][4]/*[@class=\"android.widget.LinearLayout\"][1]/*[@class=\"android.widget.RelativeLayout\"][1]";

driver.elementByXpath(xpath).click();

获取当前 activity driver.getCurrentActivity()

获取 APP activity 的 xml 结构 driver.dumpHierarchy();

完整例子 package atx.client;

import atx.client.enums.MaskNum;

import atx.client.model.DesiredCapabilities;

import org.junit.Before;

import org.junit.Test;

import java.util.HashMap;

import java.util.Map;

/**

* Created by 飞狐 on 2018/4/22.

*/

public class AtxClientTest {

AtxClient driver = new AtxClient();

@Before

public void setUp() throws Exception{

DesiredCapabilities desiredCapabilities = new DesiredCapabilities();

desiredCapabilities.setPackageName("com.netease.cloudmusic");

desiredCapabilities.setRemoteHost("192.168.2.81");

driver.initDriver(desiredCapabilities);

}

@Test

public void testNetE() throws Exception{

driver.elementByName("私人FM").click();

driver.elementByDesc("转到上一层级").click();

driver.elementByName("每日推荐").click();

driver.elementByDesc("转到上一层级").click();

driver.elementByName("歌单").click();

driver.elementByDesc("转到上一层级").click();

driver.elementByName("排行榜").click();

driver.elementByDesc("转到上一层级").click();

}

/**

* 搜索歌曲

*/

@Test

public void testSearchSong() throws Exception{

// driver.elementByDesc("搜索").click();

Map searchParams = new HashMap();

searchParams.put(MaskNum.DESCRIPTION.getDes(),"搜索");

searchParams.put(MaskNum.CLASS_NAME.getDes(),"android.widget.TextView");

driver.elementByMult(searchParams).click();

String keys = "大王叫我来巡山";

driver.elementById("com.netease.cloudmusic:id/search_src_text").sendKeys(keys);

Map songParams = new HashMap();

songParams.put(MaskNum.TEXT_STARTS_WITH.getDes(),"搜索");

songParams.put(MaskNum.CLASS_NAME.getDes(),"android.widget.TextView");

driver.elementByMult((songParams)).click();

//选择一个音乐开始播放咯

String xpath = "//*[@resource-id=\"com.netease.cloudmusic:id/gt\"]/*[@class=\"android.widget.LinearLayout\"][4]/*[@class=\"android.widget.LinearLayout\"][1]/*[@class=\"android.widget.RelativeLayout\"][1]";

driver.elementByXpath(xpath).click();

driver.sleep(5000);

//由于xml不断变化,导致 播放暂停无法找到,因此直接使用xpath进行解决

System.out.println("播放暂停");

String xpath1 = "//*[@content-desc=\"播放暂停\"]";

driver.elementByXpath(xpath1).click();

System.out.println("转到上一层级");

driver.elementByDesc("转到上一层级").click();

driver.elementByDesc("收起").click();

}

/**

* 查找多级元素

*/

@Test

public void testElements() throws Exception{

driver.dumpHierarchy();

driver.elementByXpath("//*[@resource-id=\"com.netease.cloudmusic:id/gt\"]/*[@class=\"android.widget.LinearLayout\"][1]/*[@class=\"android.widget.LinearLayout\"][3]/*[@class=\"android.widget.ImageView\"][1]").click();

}

/**

* 测试杂七杂八

*/

@Test

public void testGetOther() throws Exception{

System.out.println(driver.getCurrentActivity());

}

}

Key Events(已完成) driver.press(KeyEventEnum.VOLUME_DWON.getValue());

截图 String fileName = "/Users/huqingen/Desktop/Finger/Git/test/atxuiautomatorclient/picture/1.jpg";

driver.takeScreenshot(fileName);

支持 adb 命令方法 (也支持元素查找及点击)

private DesiredCapabilities desiredCapabilities = new DesiredCapabilities();

@Before

public void setUp() throws Exception{

desiredCapabilities.setPackageName("com.tuotuo.solo");

desiredCapabilities.setRemoteHost("192.168.2.81");

driver.initDriver(desiredCapabilities);

}

@Test

public void testAdbEl(){

AdbDevice adbDevice = AdbDevice.getInstance(desiredCapabilities);

Position position = Position.getInstance(desiredCapabilities);

//获取设备信息

System.out.println("设备序列号: " + adbDevice.getDeviceId());

System.out.println("设备名称: " + adbDevice.getDeviceName());

int[] resolution = adbDevice.getScreenResolution();

System.out.println("设备屏幕分辨率: " + resolution[0] + "x" + resolution[1]);

System.out.println("设备Android版本: " + adbDevice.getAndroidVersion());

System.out.println("设备SDK版本: " + adbDevice.getSdkVersion());

System.out.println("设备电池状态: " + adbDevice.getBatteryStatus());

System.out.println("设备电池温度: " + adbDevice.getBatteryTemp());

System.out.println("设备电池电量: " + adbDevice.getBatteryLevel());

if(position.waitForElement(ElementAttribs.TEXT,"账号",WAIT_TIMEOUT)) {

ElementAdb e_search = position.findElementById("com.tuotuo.solo:id/rl_exchange_code");

adbDevice.click(e_search);

}

if(position.waitForElement(ElementAttribs.TEXT,"输入兑换码,兑换后即刻生效",WAIT_TIMEOUT)) {

ElementAdb e_search = position.findElementByText("输入兑换码,兑换后即刻生效");

adbDevice.click(e_search);

adbDevice.sendText("hahahahah");

driver.press(KeyEventEnum.ENTER.getValue());

ElementAdb e_txt = position.findElementByText("兑换码");

adbDevice.click(e_txt);

ElementAdb e_enter = position.findElementByText("确定兑换");

adbDevice.click(e_enter);

}

}

飞狐的日线 java_JAVA 版 ATX-Client相关推荐

  1. atx860和java_JAVA 版 ATX-Client

    背景 由于我们这边正在进行 app 自动化工具选型,目前暂定选用 macaca,但 macaca 存在没有无线测试连接方案,后来在论坛上看到 @codeskyblue 开源的 atx-agent 方案 ...

  2. nc要用多少版本的java_java版简易 nc

    实现一个Java版的简易nc,用于方便windows上spark streaming的socketTextStream 的测试 界面如下 运行方式 有两种: 不添加端口号参数,直接运行的话,默认监听9 ...

  3. 飞机大战java_java版飞机大战实战项目详细步骤

    本文为大家分享了java版飞机大战实战项目,供大家参考,具体内容如下 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是 ...

  4. 状态机 java_java版的状态机实现

    状态机适用场景: C的操作,需要等到A.B的两个操作(A.B顺序操作),那就需要在 A.B之间创建一个状态机(state machine),C的操作需要状态机达到某一个状态才能进行 1. Overvi ...

  5. 坦克大战java_java版坦克大战游戏源码

    [java]代码库package tankwar; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; imp ...

  6. 果园种树java_Java版淘金果园系统

    2017淘金果园系统,完整游戏功能和模拟交易,质优价廉,欢迎来电 现在很多几百几千的农场源码都是通过微客农场改的,仿照的也只是界面,后端功能并不完善,漏洞很多,千篇全部,有的技术连框架都改不了,玩家一 ...

  7. 飞行棋 java_java版飞行棋

    没事闲着蛋疼写的,大家瞧瞧 1.[图片] 1.png 2.[代码][Java]代码 package com.woitt.batt.entiry; import java.awt.Cursor; imp ...

  8. 情侣的网站代码java_java版给爱人表白祝福的小项目

    [实例简介] 记得要使用 jdk1.6才可以, 1.7的不支持其中一个语法 [实例截图] [核心代码] blessing ├── blessing │   ├── a.png │   ├── bin ...

  9. qq空间java_Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据流程分析...

    QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址: 1. 截图看一看效果: 1.1抓取执行过程: 1.2 部分数据截图: 1.3 每一个说说的具体内容 ...

最新文章

  1. 【OpenCV】cv::Mat对单个像素的访问和操作
  2. 机器学习的宝典-华校专老师的笔记
  3. boost::gregorian模块实现查找给定月份最后一天的测试程序
  4. Tengine---nginx平台初探
  5. iOS 开发一定要尝试的 Texture(ASDK) 1
  6. cannot convert value of type ‘org.codehaus.xfire.spring.editors.ServiceFactoryEditor
  7. Cachegrind:缓存和分支预测分析器
  8. awk处理之案例五:awk匹配字段2包含字段1的文本
  9. python制作动图、怎么运行_漫画:如何分析运行中的 Python 程序?
  10. L1-015 跟奥巴马一起画方块 (15 分) — 团体程序设计天梯赛
  11. Python 这么热,运维要不要追赶 Python 的热潮?
  12. matlab输出复数值到.txt文件中
  13. 老毛子固件二级路由实现ipv6上网
  14. 信用卡分期年化利率计算方法
  15. 微信获取当前位置-vue中
  16. 清除默认浏览器CSS样式
  17. win10下装python
  18. 手机短信验证码一次性 需要第三方平台
  19. 推荐一个非常好的IOS编程技巧网站
  20. 校园歌手信息评分系统(C语言),大一新生期末实训

热门文章

  1. 出现问题Debug Assertion Failed!
  2. 现代软件工程—构建之法---第三章:练习与讨论
  3. localhost方式提交作业到spark运行
  4. 服务容错保护断路器Hystrix之四:断路器监控(Hystrix Dashboard)-turbine集群监控
  5. 【js Date】时间字符串、时间戳转换成今天,明天,本月等文字日期
  6. 外键列到底要建在哪里?
  7. RecyclerView通过notifyItemChanged方法更新item数据避免闪烁
  8. Flex 传JAVA BEAN 到后台 JAVA
  9. Lucene之样例解析(1)-配置Lucene的源代码
  10. windows的libcurl下zlib1.dll问题