本文主要介绍node+appium+android实现自动化测试。因为大部分网上搜索到的资料都是通过python+appium进行测试的,所以自己总结一下node的
目录
一、基础知识
1、appium环境相关
1)、node (appium's runtime environment)
2)、appium (` npm install -g appium`), 本地调试也可以下载appium桌面版本
3)、android sdk ("adb" and "ANDROID_HOME" , "ANDROID_SDK_ROOT" environment variable are needed)
4)、jdk ("JAVA_HOME" env should be set)
以上环境是运行appium必须要配置的,因为appium是一个node服务,所以本地必须有node.js的环境。当然我们可以直接使用appium-doctor来检查自己的appium环境是否配置好。
2、appium启动
appium可以通过桌面版本启动,也可以直接通过appium命令启动。当然如果用命令启动的话上面的步骤二 是一定要安装的。
appium的默认端口是4723。如果启动多测试多台手机建议启动过个appium服务。
命令启动:
appium --address 0.0.0.0 --port 4723 --bootstrap-port 4726
appium -a 127.0.0.1 -p 4727 -bp 4728
注意: -bp 是连接Android设备bootstrap的端口号,默认是4724(也可写成--bootstrap-port)需要注意的是如果启动多个appium服务的话,-bp是必须指定的。
3、adb server
adb默认server的端口是5037,如果我们想一个adb server操作一台手机的话,可以通过下面的命令再启动adb server
adb -P 5038 start-server
adb -P 5038 kill-server
4、adb命令
因为我们的大部分的服务都是部署在linux系统上的,当然连接上手机后我们也可以直接使用adb命令操作手机。
adb -P 5037 -s 10.211.217.7:15081 shell am force-stop 包名
注:-P 指的是adb server的端口号 -s 指的是通过adb devices查看到的要操作的设备名字。
获取屏幕节点的方法,如果你的uiautomatorviewer 不好使的话
adb shell uiautomator dump /sdcard/sc.uix
adb pull /sdcard/sc.uix
然后把.uix改成.xml文件结尾就可以查看了
二、相关文档集合
1、appium的能力集合
appium 能力集 : (这个能力集合里面的参数,在我们启动app的时候会用到)
https://appium.io/docs/en/writing-running-appium/caps/
2、wb包的方法集合(如何操作手机的方法集合)
wb 包的方法合集:
https://github.com/admc/wd/blob/master/lib/commands.js#L1780
3、appium的原理介绍
下面的文章会介绍session相关的内容,我们的每次appium操作都是有对应的session的,session过期后对应启动的app也会退出的。
https://www.jianshu.com/p/30b3b2d6b901
三、简单的例子
const wd = require("wd");
const serverConfig = {
host: "localhost",
port: 4723,
};
//获取到wd的driver
const driver = wd.promiseChainRemote(serverConfig);
let desired: any = {
platformName: "Android",
deviceName: "设备的名字,adb devices",
//platformVersion: '2.0.0',
appPackage: config.appPackage,
noReset: true,
resetKeyboard: true,
appActivity: config.appActivity,
newCommandTimeout: 120,
//adbPort, 如果使用的adb的server不是5037端口就需要指定了
udid: "设备的名字,adb devices" //操作多台手机使用, 这个必须有的
};
//获取元素并点击
let access: any = await catchEX(driver.elementByAndroidUIAutomator(`text("同意")`));
if (access && JSON.stringify(access) != "{}") {
await access.click();
await sleep(3000);
}
driver.quit();
注意:我们通过wb获取到的driver,在查找界面元素的时候,如果没有查找的话,会报错的,我们需要catch住这个promise的报错。
四、常见错误
1、Android bootstrap socket crashed: Error: This socket has been ended by the other party
这个可能因为我们操作了多台手机,而启用了一个appium服务。导致一些连接被占用或出现问题。这时候建议使用一个手机使用一个appium服务