Bob's Blog

Python、Web开发、测试框架、自动化平台、机器学习等

返回上页首页

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)

 

下一篇:  常用linux命令
上一篇:  ruby在gem list/install时提示编码等错误的解决方法

共有2条评论

添加评论

Bo
2019年4月4日 13:58
@Sam, “ready”不准确,当你的手机未连接时仍可能为true,所以用的“present”。
Sam
2019年4月4日 11:33
可以使用ready的值来判断吗?