appium是一个开源的用于移动和桌面应用的自动化测试工具
准备
下载安卓 sdk 和 android 和 android studio 安装 docker
创建avd
avdmanager create avd -n avdtest -k "system-images;android-28;google_apis;x86"
下载demo apk
安装 appium
npm install -g appium
安装 appium-doctor
npm install -g appium-doctor
运行 appium-doctor,根据提示安装缺失依赖(比如 java 等)
运行avd
emulator -avd avdtest
运行一个 proxy(因为 emulator 运行的 avd 监听的是 localhost,可以使用其他反向代理) 这里写个简单代码 proxy.go
package main
import (
"io"
"net"
)
func main() {
ln, err := net.Listen("tcp", ":5553")
if err != nil {
panic(err)
}
for {
conn, err := ln.Accept()
if err != nil {
panic(err)
}
go serve(conn)
}
}
func serve(src net.Conn) {
dst, err := net.Dial("tcp", "127.0.0.1:5555")
if err != nil {
panic(err)
}
go io.Copy(src, dst)
go io.Copy(dst, src)
}
运行 proxy
go run proxy.go
运行 appium
假设10.105.16.166 为目标 ip,/data 是 apk 的位置
docker run -d -p 4723:4723 -e REMOTE_ADB=true -e ANDROID_DEVICES=10.105.16.166:5553 -e REMOTE_ADB_POLLING_SEC=3 -v /data:/data --name container-appium appium/appium
新建测试
mkdir appiumtest
cd appiumtest
npm init -y
npm install webdriverio
获取 devicename
adb devices
创建 index.js,内容如下
const wdio = require("webdriverio");
const assert = require("assert");
const opts = {
path: "/wd/hub",
port: 4723,
capabilities: {
platformName: "Android",
platformVersion: "9",
deviceName: "emulator-5554", //上一步获取的
app: "/path/to/ApiDemos-debug.apk",
appPackage: "io.appium.android.apis",
appActivity: ".view.TextFields",
automationName: "UiAutomator2",
},
};
async function main() {
const client = await wdio.remote(opts);
const field = await client.$("android.widget.EditText");
await field.setValue("Hello World!");
const value = await field.getText();
assert.equal(value, "Hello World!");
await client.deleteSession();
}
main();
运行测试
node index.js
提示
安卓模拟器相关:
查看
./bin/sdkmanager --list --sdk_root=/path/to/lib
安装 platform-tools
./bin/sdkmanager --sdk_root=/path/to/lib "platform-tools" "platforms;android-28"
安装 emulator
./bin/sdkmanager --sdk_root=/path/to/lib emulator