环境搭建
命令行形式安装
(1)公用软件安装:
安装jdk1.8并配置环境变量——sdk安装并配置环境变量——node安装(一般会自动配置环境变量)——安装安卓模拟器夜神并启动——检查 adb(adb) 及设备连接(adb connect 127.0.0.1:62001 adb devices)
(2)appium安装:
npm -g install appium@1.15.1
检查:appium
npm -g install appium-doctor
检查:appium-doctor
界面版安装
Appium-desktop 版本安装:
下载地址:https://github.com/appium/appium-desktop/releases/tag/v1.15.1
下载后一路默认安装
界面版可以进行元素定位调式、脚本录制
安卓基础命令
连接模拟器:adb connect 127.0.0.1:62001
检查连接设备:adb devices
安装app:adb install D:\douban.apk
指定设备安装app:adb -s 设备名称 install D:\douban.apk
卸载app:adb uninstall “com.douban.frodo” (app包名)
查看app的包名和activity:aapt d badging D:\douban.apk|findstr “package launchable-activity”
没有app源文件的情况下查看app包名:模拟器打开app——UI Automator viewer或Appium查看字段package的值
查看真机APP当前界面的包名和activity: adb shell dumpsys window windows|findstr “mCurrent”
判断是否已经安装某APP:adb shell dumpsys package 包名
向设备传输文件:adb push D:\a.txt /data/local/tmp (安卓系统是改装过的Linux系统)
进入设备系统:adb shell
从设备拉取文件到电脑:adb pull /data/local/tmp/a.txt D:\a.txt
抓设备日志:adb logcat
收集日志:adb logcat>D:\log.txt (>覆盖 >>追加)
查看安卓版本:adb.exe -P 5037 shell getprop ro.build.version.sdk
查看发布的安卓的版本:
adb.exe -P 5037 shell getprop ro.build.version.release
windows的命令:
查看端口是否被占用:netstat -ano|findstr 5037
杀掉进程:taskkill -f -pid 进程号
杀掉adb:adb kill-server
重启adb:adb start-server
Appium工作原理
脚本编写
pom.xml文件配置相关jar包:java-client
执行脚本前步骤:1. 启动appium;2.检查设备连接
定位元素
工具:UI Automator viewer或Appium(可进行元素定位调式)
方法:
driver.findElement(MobileBy.AndroidUIAutomator("text(\"我的\")")).click();
driver.findElement(MobileBy.AccessibilityId("Navigate up")).click(); //返回"我的"页面
id与xpath定位方式与web端一样(安卓端的id是resource-id字段)
页面滑动
整屏滑动
public void swipeToUp() {
int x=driver.manage().window().getSize().getWidth();//应用占用屏幕的宽
int y=driver.manage().window().getSize().getHeight();//应用占用屏幕的高
TouchAction ta=new TouchAction(driver);
ta.press(PointOption.point(x/2, 8*y/10)).waitAction(WaitOptions.waitOptions(Duration.ofMillis(500))).
moveTo(PointOption.point(x/2, 2*y/10)).release().perform();
}
元素滑动
public void swipeOnElement(AndroidElement element,String direction){
int start_x = element.getLocation().getX();//起始点坐标X
int start_y = element.getLocation().getY(); //起始点坐标Y
int width = element.getSize().getWidth();//生日中年份的宽
int height = element.getSize().getHeight();//生日中年份的高
switch (direction.toLowerCase()){
case "up":
swipe(start_x+width/2,start_y+8*height/10,start_x+width/2,start_y+2*height/10,500);
break;
case "down":
swipe(start_x+width/2,start_y+2*height/10,start_x+width/2,start_y+8*height/10,500);
break;
case "left":
swipe(start_x+8*width/10,start_y+height/2,start_x+width/2,start_y+2*height/10,500);
break;
case "right":
swipe(start_x+2*width/10,start_y+height/2,start_x+8*width/10,start_y+height/2,500);
break;
default:
throw new RuntimeException("方向参数错误");
}
}
滑动年份都指定年份
//滑动年到指定年份
String exceptYear = driver.findElement(By.id("android:id/numberpicker_input")).getText();
while (!exceptYear.equals("1996")){
if(Integer.parseInt(exceptYear)>1996){
utils.swipeOnElement(year,"down");
}else if(Integer.parseInt(exceptYear)<1996){
utils.swipeOnElement(year,"up");
}
exceptYear = driver.findElement(By.id("android:id/numberpicker_input")).getText();
}
手势解锁
获取手势元素的起始点坐标和宽、高,宽和高分别六等分可以得到九个点的坐标