设备占用接口参考了openstf的API
其中$SERVER_URL
代表atxserver2的地址,如http://localhost:4000
所有的接口采用token认证,每个请求在 Header中增加 Authorization: Bearer xxxxx-token-xxxx
token可以在 $SERVER_URL/user
界面获取到
获取到token后,可以先做一个小的尝试。假设token被保存到了$TOKEN
这个环境变量中
$ pip install httpie # 安装http命令行工具
$ http GET $SERVER_URL/api/v1/user Authorization:"Bearer $TOKEN"
{
"username": "fa",
....
}
如果Token填写错误,服务器响应403 Forbidden
下面的一些操作也都是用
httpie
这个小工具做的演示,使用方法见httpie cheetsheet
GET /api/v1/user
$ http GET $SERVER_URL/api/v1/user
{
"email": "[email protected]",
"username": "fa",
"token": "xxxxx.....xxxxx",
"createdAt": "2019-03-06T12:38:02.338000",
...
}
GET /api/v1/devices
$ HTTP GET $SERVER_URL/api/v1/devices
# 支持的过滤参数 ?platform=apple&usable=true
{
"success": true,
"devices": [{
"platform": "android",
"present": true,
"using": true,
"colding": false,
"userId": "[email protected]",
"properties": {
"brand": "SMARTISAN",
"version": "7.1.1"
},
....
}],
"count": 4,
}
几个比较重要的字段说明
platform
目前有两个值android
和apple
present
代表设备是否在线colding
代表设备是否正在清理或者自检中, 此时是不能占用设备的using
代表设备是否有人正在使用userId
代表使用者的ID,这里的ID其实就是Emailproperties
代表设备的一些状态信息,基本都是静态信息
usable等价于{present: true, using: false, colding: false}
POST /api/v1/user/devices
$ http POST $SERVER_URL/api/v1/user/devices <<< '{"udid": "xx...xxxx"}'
{
"success": true,
"description": "Device successfully added"
}
通过payload传递数据,JSON格式
- udid是必须字段(Android设备的udid是设备的product,mac地址,serial组合生成的)
- idleTimeout: 设备最长空闲时间 seconds(可选), 当前时间 - 活动时间 > idleTimeout 自动释放设备
{
"udid": "xlj1311l2fkjkzdf",
"idleTimeout": 600
}
更新活动时间接口
GET /api/v1/user/devices/{$UDID}/active
$ http GET /api/v1/user/devices/${UDID}/active
{
"success": true,
"description": "Device activated time updated"
}
GET /api/v1/user/devices/${UDID}
$ http GET $SERVER_URL/api/v1/user/devices/${UDID}
{
"success": true,
"device": {
"platform": "android",
"present": true,
"using": true,
"colding": false,
"userId": "[email protected]",
"properties": {
"brand": "SMARTISAN",
"version": "7.1.1"
},
"source": {
"atxAgentAddress": "10.0.0.1:20001",
"remoteConnectAddress": "10.0.0.1:20002",
"whatsInputAddress": "10.0.0.1:20003",
"secret": "6NC5Tls1",
"url": "http://10.0.1.1:3500",
}
}
}
比 /api/v1/devices
获取到的设备,多出一个source字段,下面详细说明下
Android和iOS source都包含的部分
- url: provider的URL,通过可以让设备cold和安装应用
Android的source独有内容
- atxAgentAddress: 主要用于uiautomator2测试框架
- remoteConnectAddress: 用于
adb connect
连接使用 - whatsInputAddress: 这个可以不用关注,他主要提供远程真机的实时输入法
iOS的source独有内容
- wdaUrl: webdriveragent用到的http接口,eg
http://10.0.0.1:9300
WebSocket访问${wdaUrl}/screen
可以获取到当前的图片流
DELETE /api/v1/user/devices/${UDID}
$ http DELETE $SERVER_URL/api/v1/user/devices/xxx...xxx
{
"success": true,
"description": "Device successfully released"
}
POST /uploads
$ http POST $SERVER_URL/uploads [email protected]
HTTP/1.1 200 OK
Content-Length: 411
Content-Type: application/json; charset=UTF-8
Date: Wed, 23 Jan 2019 06:28:54 GMT
Server: TornadoServer/4.5.3
{
"data": {
"url": "http://localhost:4000/uploads/13/f46364434b526b77620ebf9bcf7322/com.doublep.wakey.apk",
"md5sum": "13f46364434b526b77620ebf9bcf7322",
"iconPath": "res/drawable-xxhdpi/ic_launcher.png",
"iconUrl": "http://localhost:4000/uploads/13/f46364434b526b77620ebf9bcf7322/icon.png",
"packageName": "com.doublep.wakey",
"mainActivity": ".Bulb",
"versionCode": "18",
"versionName": "2.3"
},
"success": true
}
这个要用到PROVIDER_URL
对应设备信息接口返回值中的source.url
字段,另外需要指定udid(因为provider可能连接了多个手机)
POST $PROVIDER_URL/app/install?udid=xxxx
$ http --form POST $PROVIDER_URL/app/install?udid=xxxx url==http://example.com/some.apk
# 成功返回 200
{
"success": true
"return": 0,
"output": "Success\r\n",
"packageName": "io.appium.android.apis",
}
# 失败返回 200
{
"description": "Failure reason",
"success": false
}
这个要用到PROVIDER_URL
对应设备信息接口返回值中的source.url
字段,另外需要指定udid(因为provider可能连接了多个手机)
POST $PROVIDER_URL/app/install?udid=xxxx
$ http --form POST $PROVIDER_URL/app/install?udid=xxxx url==http://example.com/some.ipa
# 成功返回 200
{
"success": true
"return": 0,
"output": "Success",
}
# 失败返回 200
{
"description": "Failure reason",
"success": false
}