openstf与appium集成以自动化操作远程手机设备
在本文中会介绍如何自动化操作远程手机设备,可以用于自动化测试或者其他用途。
stf可以统一管理和控制许多的手机设备,这比公司里分散管理要好得多,就像一个图书馆一样,也可以提高设备的使用率,不用谁请假了他借的手机就只有他回来才能被别人用,晚上设备也可以用于自动化测试,挺好。在前一篇文章中,已经记录了openstf的环境搭建和一些问题的解决方式:https://www.byincd.com/bobjiang/article-0164/。
同事们可以在stf上借手机和归还手机,要用于自动化测试总不能用人工借了手机再跑测试,这个对于个人调试脚本时没有问题,但是如果是自动触发回归的话就很尴尬了。其实也不然,因为stf也有一些restful api,可以通过api占用设备,并将设备连接,在使用完了后释放设备资源供其他脚本和其他人使用。
通过stf和appium集成在一起,可以同时达到管理手机和自动化操作手机。
基本流程是:
1) stf已经识别和连接本机手机和远程手机,远程手机是用stf provider加上adb来连接,相当于连接到搭建stf的服务器。
2) 自动化脚本通过api查询可用设备,并占用该设备和获取连接ip+port,通过adb把远程手机连接到本机。
3) 脚本运行或者自定义操作。
4) 通过api释放资源。
差不多像下面这样的,画得丑别介意。。
stf搭建好了后用这个去访问能看到设备的各种数据:your_ip/api/v1/devices/ ,比如:
{
"success": true,
"devices": [{
"abi": "arm64-v8a",
"airplaneMode": false,
"battery": {
"health": "good",
"level": 85,
"scale": 100,
"source": "usb",
"status": "charging",
"temp": 26.9,
"voltage": 4.26
},
"browser": {
"apps": [{
"id": "com.android.chrome/com.google.android.apps.chrome.Main",
"name": "Chrome",
"selected": true,
"system": true,
"type": "chrome",
"developer": "Google Inc."
}],
"selected": true
},
"channel": "u3Kg7gUkA3Qy6DmKpCsZoHWFwio=",
"cpuPlatform": "exynos5",
"createdAt": "2019-03-06T01:32:42.744Z",
"display": {
"density": 4,
"fps": 59,
"height": 2560,
"id": 0,
"rotation": 0,
"secure": true,
"size": 5.503512859344482,
"url": "ws://10.109.1.65:7452",
"width": 1440,
"xdpi": 522.5139770507812,
"ydpi": 537.3880004882812
},
"manufacturer": "SAMSUNG",
"model": "SM-G920V",
"network": {
"connected": false,
"failover": false,
"roaming": false,
"subtype": null,
"type": null
},
"openGLESVersion": "3.1",
"operator": null,
"owner": {
"email": "bo.jiang@activenetwork.com",
"group": "O3yiHfGuQJmwtd2lqpOasA==",
"name": "bojiang"
},
"phone": {
"iccid": null,
"imei": "990004861204448",
"imsi": null,
"network": "UNKNOWN",
"phoneNumber": null
},
"platform": "Android",
"presenceChangedAt": "2019-03-06T01:41:15.949Z",
"present": true,
"product": "zerofltevzw",
"provider": {
"channel": "WbFbnjfcTxOJKAxCTVfqew==",
"name": "Mac-mini.local"
},
"ready": true,
"remoteConnect": false,
"remoteConnectUrl": null,
"reverseForwards": [],
"sdk": "21",
"serial": "03157df36144d40d",
"status": 3,
"statusChangedAt": "2019-03-06T01:41:15.949Z",
"usage": "automation",
"usageChangedAt": "2019-03-06T01:41:24.385Z",
"version": "5.0.2",
"using": true
}]
}
当present为true和using为false时就可以确定设备可用,占用该设备后,再次取设备json可以看到remoteConnectUrl,这个地址就可以用于adb的连接。就是resetful api的get/post/put/delete行为,就可以满足我们的需要了。然后就可以指定对应设备的desired capability便可用appium来操作手机,和本机调试差不多了。
api的作用可以参考官方的说明文档: https://github.com/openstf/stf/blob/master/doc/API.md
api的一些使用可以参考我在github写过的python项目:https://github.com/bobjiangps/stf_appium_python_sample
比如:
class StfDevices:
def __init__(self, ip):
self.ip = ip
self.prefix = "http://"
self.device_suffix = "/api/v1/devices"
self.user_device_suffix = "/api/v1/user/devices"
self.token = "951cfcdf4bc045849f55e810d863fbecaf01b07b54cf49879b573a77a8c389f4"
self.device_url = self.prefix + self.ip + self.device_suffix
self.user_device_url = self.prefix + self.ip + self.user_device_suffix
def __get_all_devices_info(self):
headers = {"Authorization": "Bearer " + self.token}
result = requests.get(self.device_url, headers=headers)
return result
def count_available_devices(self):
all_devices = self.__get_all_devices_info()
available_devices = []
if all_devices.status_code == 200:
devices_json = json.loads(all_devices.text)
if devices_json["success"]:
for d in devices_json["devices"]:
if d["present"] == True and d["using"] == False:
available_devices.append(d)
print("%d devices available for you to use" % len(available_devices))
return len(available_devices), available_devices
else:
print("failed to get devices info")
else:
print("wrong status: %d" % all_devices.status_code)
共有2条评论
添加评论
Bo
2019年4月4日 13:58@Sam, “ready”不准确,当你的手机未连接时仍可能为true,所以用的“present”。
Sam
2019年4月4日 11:33可以使用ready的值来判断吗?