what's appium?
Appium是一个自动化测试开源工具,支持iOS和android平台上的移动原生应用、移动Web应用和混合应用。Appium是一个跨平台工具,它允许测试人员使用同样的接口、基于不同的平台写自动化测试代码,大大增加了测试套件间代码的复用性。
- 移动原生应用:是指那些用iOS或者android sdk写的应用;
- 移动web应用:是指那些使用移动浏览器访问的应用,appium支持iOS的safari和android上的chrome;
- 混合应用:是指原生代码封装在网页视图(原生代码和web内容交互)。
背景
最近在写一个社交账号监控平台,用来监控指定好友的日常状态。考虑到多数社交平台的移动端功能更多,所以研究了一下 Appnium 这个软件。
之前写过几篇跟 WebDriver 有关的文章,Appnium 使用了 WebDriver 协议,所以很多地方你都能看到 WebDriver 的影子,学过 WebDriver 系列的更容易上手。
准备
- Appnium Desktop
- Android SDK
- Appnium Java Client
使用 Appnium 首先要安装它的 Server 端,我用的是 1.8 版本。
可以去官网或者Github下载 appium.io
Android sdk 下载好了 添加到 一个变量 ANDROID_HOME,然年把 /tools 和 /platform-tools 目录添加到 PATH 变量里
在 Maven 添加两个依赖
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>LATEST</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>LATEST</version>
</dependency>
这个地方有个坑,selenium 和 appnium 版本要对应,不然会有异常。
Demo
先开启服务
然后手机连接电脑开启开发模式,或者启动 Android 模拟器。
输入命令 adb devices
List of devices attached
emulator-5554 device
emulator-5554
就是 deviceName。
然后这里我演示一下打开 QQ 然后模拟登录的过程。
过程:打开 APP > 点击登录 > 清空账号密码 > 输入账号密码 > 登录
打开 APP 需要 应用包名、activity名、device名。
device设备名称已经通过 adb 拿到了。
现在在模拟器上打开 QQ 。然后 在输入adb命令
adb shell dumpsys window w |findstr \/ |findstr name=
mSurface=Surface(name=com.tencent.mobileqq/com.tencent.mobileqq.activity.LoginActivity)
com.tencent.mobileqq 是包名 com.tencent.mobileqq.activity.LoginActivity 是activity名。
最后需要获取 APP 中元素的 ID。
这里可以通过 Android SDK 中 tools 目录的 uiautomatorviewer 来获取。
代码:
public static void main(String[] args) throws MalformedURLException {
AndroidDriver appium = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),
genCap("emulator-5554", "4.4.2", "com.tencent.mobileqq", "com.tencent.mobileqq.activity.SplashActivity", "com.tencent.mobileqq.activity.LoginActivity"));
appium.findElementById("com.tencent.mobileqq:id/btn_login").click(); //点击登录按钮
List<WebElement> e = appium.findElementsByClassName("android.widget.EditText");
WebElement user = e.get(0); // 获取账号输入框
WebElement pass = e.get(1); // 获取密码输入框
user.clear();
pass.clear();
user.sendKeys("****"); //输入内容
pass.sendKeys("****");
appium.findElementById("com.tencent.mobileqq:id/login").click(); //点击登录按钮
}
public static DesiredCapabilities genCap(String deviceName, String platformVersion, String appPackage, String appActivity, String appWaitActivity) throws MalformedURLException {
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(CapabilityType.BROWSER_NAME, "");
cap.setCapability("platformName", "Android"); //指定测试平台
cap.setCapability("deviceName", deviceName); //指定测试机的ID,通过adb命令`adb devices`获取
cap.setCapability("platformVersion", platformVersion);
//将上面获取到的包名和Activity名设置为值
cap.setCapability("appPackage", appPackage);
cap.setCapability("appActivity", appActivity);
//A new session could not be created的解决方法
cap.setCapability("appWaitActivity",appWaitActivity);
//每次启动时覆盖session,否则第二次后运行会报错不能新建session
cap.setCapability("sessionOverride", true);
return cap;
}