├── .idea └── workspace.xml ├── README.md ├── Server ├── README.md ├── Server.py ├── ServerManager.py ├── __init__.py └── log │ └── README.md ├── apk └── __init__.py ├── common ├── ApkBase.py ├── BaseTestCase.py ├── DataProvider.py ├── DeviceManager.py ├── DriverManager.py ├── HttpServerHandler.py ├── Log.py ├── MonkeyResultEmail.py ├── MonkeyResultWiki.py ├── PreProManager.py ├── PublicMethod.py ├── RunTestManager.py ├── TestCaseManager.py ├── TheTestResult.py ├── __init__.py └── share.py ├── config ├── __init__.py └── config.yaml ├── getverifycode.sh ├── log └── README.md ├── model ├── Device.py ├── Tester.py ├── User.py └── __init__.py ├── prepro ├── ASUSZ00APreProcess.py ├── BaseDevicePreProcess.py ├── ChuiZi_YQ607PreProcess.py ├── Coopad8729PreProcess.py ├── Coopad8729blackPreprocess.py ├── Coopad8765PreProcess.py ├── Coopad9729blackPreprocess.py ├── HTCBFPreProcess.py ├── HTCD826wPreProcess.py ├── HTCONEPreProcess.py ├── HUAWEIMT7PreProcess.py ├── HUAWEIVNSAL00PreProcess.py ├── HUIWEIP6PreProcess.py ├── HuaWeiG9PreProcess.py ├── HuaWeiJAZZProPrecess.py ├── LeX620PreProcess.py ├── LianXiang5860PreProcess.py ├── LianXiangK30TPreProcess.py ├── M3notePreProcess.py ├── M57APreProcess.py ├── MEITU5PreProcess.py ├── MEITUM4PreProcess.py ├── MEIZU4PROPreProcess.py ├── MX5PreProcess.py ├── MZM1notePreProcess.py ├── MZM2NotePreProcess.py ├── Nexus6PreProcess.py ├── ONEPlusXPreProcess.py ├── OPPOA33PreProcess.py ├── OPPOA37PreProcess.py ├── OPPOA59PreProcess.py ├── OPPON5207PreProcess.py ├── OPPOR7sPreProcess.py ├── OPPOR8700PreProcess.py ├── OPPOR9PreProcess.py ├── RedMi1sPreProcess.py ├── RedMi2APreProcess.py ├── RedMiNote2PreProcess.py ├── RedMiNote3PreProcess.py ├── RedMiNote4PreProcess.py ├── Smartisan1PreProcess.py ├── Smartisan705PreProcess.py ├── SumSing9152PreProcess.py ├── SumSingNote3PreProcess.py ├── SumSingNote4PreProcess.py ├── SumSingS4PreProcess.py ├── VIVOV3MAXPreProecss.py ├── VIVOX5ProPreProcess.py ├── VivoX7PreProcess.py ├── XIAOMI2PreProcess.py ├── XIAOMI3PreProcess.py ├── XIAOMI4PreProcess.py ├── XIAOMI5PreProcess.py ├── XIAOMINOTEPreProcess.py └── __init__.py ├── res ├── README.md └── autotest │ ├── 0806EF9802963A8512369373AE9E32EC.jpg │ ├── 098C1191F2E2A94756CD49A75ABE763B.jpg │ ├── 4CA22076BFAFA339C697CA0D0E1975B2.jpg │ ├── 5343D94B01E7B43516E8841A87482454.jpg │ ├── 5A70EE0CE05BDDCC290C8674C70C62C3.jpg │ ├── 7F0FFD3206D307DFA463D3E69A4690A2.jpg │ ├── B1758FB83C0834B7A4F490B1D8A34A12.jpg │ ├── CEDF4620EAA3DC538A1F9F964B40DE4C.jpg │ └── DCDF783DE47BF56CB43153DF81E90B62.jpg ├── run_mode_autotest.py ├── run_mode_monkey.py ├── run_server_appium.py ├── run_server_http.py ├── stopAll.py ├── testcase ├── __init__.py ├── test_just_try.py └── test_story_pub_image.py └── testresult ├── README.md ├── result.css ├── result.js └── sorttable.js /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 13 | 14 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 55 | 56 | 57 | 58 | 68 | 69 | 86 | 87 | 98 | 99 | 117 | 118 | 132 | 133 | 134 | 136 | 137 | 138 | 139 | 1505235633552 140 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 172 | 173 | 174 | 175 | 176 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | appium_pyton_android 2 | 继承并封装了appium,Android移动端自动化测试框架。 3 | 支持多设备并发运行testcase,直接错误log及截图功能,html输出测试报告等。 4 | 5 | 简单介绍下用法: 6 | 7 | 1、运行前请添加测试包、设备信息到config.yaml中 8 | NiceAPK: /Users/xxxxx/xxx.apk # 测试包的路径 9 | 10 | Devices: 11 | - deviceid: 5HUC9S6599999999 # 设备识别adb devices的值 12 | devicename: OPPO_R9M # 设备的名称,用于区分 13 | serverport: 4723 # -p Appium的主要端口,设备之间不能重复 14 | bootstrapport: 4823 # -bp Appium bootstrap端口,设备之间不能重复 15 | platformname: Android # desired_caps 16 | platformversion: 5.1 # desired_caps 17 | server: 127.0.0.1 # 地址 18 | 19 | 2、测试用例,testcase目录下保留了两条参考用例,其中一条是真实用例测试com.nice.main 20 | 21 | 3、连接好所有的设备后运行run_server_appium,启动appium server 22 | 23 | 4、待appium server启动完毕,运行run_server_http 24 | 25 | 5、选择需要运行的类型:自动化测试或者monkey测试 26 | 27 | *如有任何建议欢迎邮件 h080294@163.com 28 | 29 | 具体的模块介绍:https://www.jianshu.com/p/090c04f3b077 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | # appium_python_android 39 | -------------------------------------------------------------------------------- /Server/README.md: -------------------------------------------------------------------------------- 1 | 注意:Appium Server端要求单独启动,到时方便做分布式部署 2 | 启动方法:运行run_server.py 3 | 4 | 解决每次都会安装各种APK的问题, 5 | 6 | 文件: /usr/local/lib/node_modules/appium/node_modules/appium-android-driver/lib/driver.js,注释以下几句代码 7 | await this.adb.uninstallApk(this.opts.appPackage); 8 | await helpers.installApkRemotely(this.adb, this.opts); 9 | await helpers.resetApp(this.adb, this.opts.app, this.opts.appPackage, this.opts.fastReset); 10 | await this.checkPackagePresent(); 11 | 12 | 文件:/usr/local/lib/node_modules/appium/node_modules/appium-android-driver/build/lib/driver.js 注释以下几句代码 13 | return _regeneratorRuntime.awrap(_androidHelpers2['default'].resetApp(this.adb, this.opts.app, this.opts.appPackage, this.opts.fastReset)); 14 | return _regeneratorRuntime.awrap(this.adb.uninstallApk(this.opts.appPackage)); 15 | return _regeneratorRuntime.awrap(_androidHelpers2['default'].installApkRemotely(this.adb, this.opts)); 16 | return _regeneratorRuntime.awrap(this.checkPackagePresent()); 17 | 18 | 文件:/usr/local/lib/node_modules/appium/node_modules/appium-android-driver/lib/android-helpers.js 注释以下几句代码 19 | await adb.install(unicodeIMEPath, false); 20 | await helpers.pushSettingsApp(adb); 21 | await helpers.pushUnlock(adb); 22 | 23 | 文件 /usr/local/lib/node_modules/appium/node_modules/appium-android-driver/build/lib/android-helpers.js 替换以下几句代码 24 | return _regeneratorRuntime.awrap(helpers.initUnicodeKeyboard(adb)) 替换为return context$1$0.abrupt('return', defaultIME); 25 | return _regeneratorRuntime.awrap(helpers.pushSettingsApp(adb)); 替换为return context$1$0.abrupt('return', defaultIME); 26 | return _regeneratorRuntime.awrap(helpers.pushUnlock(adb)); 替换为return context$1$0.abrupt('return', defaultIME); 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Server/Server.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from common.Log import * 5 | import subprocess 6 | import time 7 | class Server: 8 | def __init__(self, deviceobject): 9 | self.logger = Log.logger 10 | self._deviceobject = deviceobject 11 | self._cmd = "appium -p %s -bp %s -U %s --session-override" % ( 12 | self._deviceobject.serverport, self._deviceobject.bootstrapport, self._deviceobject.deviceid) 13 | 14 | def start(self): 15 | self.kill(self._deviceobject.serverport) 16 | time.sleep(3) 17 | info = u"启动设备:%s 对应的Appium Server" % self._deviceobject.devicename 18 | self.logger.info(info) 19 | self.logger.info(self._cmd) 20 | subprocess.call(self._cmd,shell=True) 21 | 22 | def stop(self): 23 | self.kill(self._deviceobject.serverport) 24 | 25 | def kill(self, port): 26 | cmd = "lsof -i:%s|awk 'NR==2{print $2}'" % port 27 | self.logger.info(cmd) 28 | pid = os.popen(cmd).read() 29 | cmd = "kill -9 %s" % pid 30 | os.popen(cmd).read() 31 | 32 | def list_connect_devices(self): 33 | info = u"已连接的设备: %s ------ %s" % (self._deviceobject.deviceid, self._deviceobject.devicename) 34 | self.logger.info(info) 35 | 36 | def list_disconnect_devices(self): 37 | info = u"!!!设备丢失!!!: %s ------ %s" % (self._deviceobject.deviceid, self._deviceobject.devicename) 38 | self.logger.info(info) 39 | -------------------------------------------------------------------------------- /Server/ServerManager.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from common.Log import * 5 | from Server import * 6 | from common.DeviceManager import * 7 | import threading 8 | 9 | class ServerManager: 10 | def __init__(self): 11 | 12 | self.testdevices = DeviceManager.testdevices 13 | self.disconnectdevices = DeviceManager.disconnectdevices 14 | self.serverobjects = [] 15 | self.threads = [] 16 | self.logger = Log.logger 17 | 18 | def start_all_server(self): 19 | for deviceid,device in self.testdevices.iteritems(): 20 | server = Server(device) 21 | self.serverobjects.append(server) 22 | thread1 = threading.Thread(target=server.start) 23 | thread1.start() 24 | 25 | def stop_all_server(self): 26 | for server in self.serverobjects: 27 | server.stop() 28 | 29 | def list_devices(self): 30 | info = u"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~已连接的设备~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 31 | self.logger.info(info) 32 | for deviceid,device in self.testdevices.iteritems(): 33 | server = Server(device) 34 | server.list_connect_devices() 35 | info = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 36 | self.logger.info(info) 37 | 38 | def list_disconnect_devices(self): 39 | info = u"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~丢失的设备~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 40 | self.logger.info(info) 41 | for deviceid, device in self.disconnectdevices.iteritems(): 42 | server = Server(device) 43 | server.list_disconnect_devices() 44 | info = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 45 | self.logger.info(info) 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Server/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/Server/__init__.py -------------------------------------------------------------------------------- /Server/log/README.md: -------------------------------------------------------------------------------- 1 | Server 端日志 -------------------------------------------------------------------------------- /apk/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/apk/__init__.py -------------------------------------------------------------------------------- /common/ApkBase.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | import os 4 | import subprocess 5 | from math import floor 6 | from common.DataProvider import DataProvider 7 | 8 | 9 | class ApkInfo(): 10 | 11 | def __init__(self): 12 | apkpath = DataProvider.niceapk 13 | self.apkpath = apkpath 14 | 15 | def get_apk_size(self): 16 | """ 17 | 获取包的大小 18 | """ 19 | size = floor(os.path.getsize(self.apkpath) / (1024 * 1000)) 20 | return str(size) + "M" 21 | 22 | def get_apk_version(self): 23 | """ 24 | 获取版本 25 | """ 26 | cmd = "aapt dump badging " + self.apkpath + " | grep versionName" 27 | result = "" 28 | p = subprocess.Popen(cmd, stdout=subprocess.PIPE, 29 | stderr=subprocess.PIPE, 30 | stdin=subprocess.PIPE, shell=True) 31 | (output, err) = p.communicate() 32 | if output != "": 33 | result = output.split()[3].decode()[12:] 34 | return result 35 | 36 | def get_apk_name(self): 37 | """ 38 | 获取应用名 39 | """ 40 | cmd = "aapt dump badging " + self.apkpath + " | grep application-label: " 41 | result = "" 42 | p = subprocess.Popen(cmd, stdout=subprocess.PIPE, 43 | stderr=subprocess.PIPE, 44 | stdin=subprocess.PIPE, shell=True) 45 | (output, err) = p.communicate() 46 | if output != "": 47 | result = output.split()[0].decode()[18:] 48 | return result 49 | 50 | def get_apk_pkg(self): 51 | """ 52 | 获取包名 53 | """ 54 | cmd = "aapt dump badging " + self.apkpath + " | grep package:" 55 | result = "" 56 | p = subprocess.Popen(cmd, stdout=subprocess.PIPE, 57 | stderr=subprocess.PIPE, 58 | stdin=subprocess.PIPE, shell=True) 59 | (output, err) = p.communicate() 60 | if output != "": 61 | result = output.split()[1].decode()[6:-1] 62 | return result 63 | 64 | def get_apk_version_code(self): 65 | """ 66 | 获取version code 67 | """ 68 | cmd = "aapt dump badging " + self.apkpath + " | grep package | awk '{print $3}'" 69 | result = "" 70 | p = subprocess.Popen(cmd, stdout=subprocess.PIPE, 71 | stderr=subprocess.PIPE, 72 | stdin=subprocess.PIPE, shell=True) 73 | (output, err) = p.communicate() 74 | if output != "": 75 | result = output.strip('\r\n') 76 | return result 77 | 78 | def get_apk_version_name(self): 79 | """ 80 | 获取version name 81 | """ 82 | cmd = "aapt dump badging " + self.apkpath + " | grep package | awk '{print $4}'" 83 | result = "" 84 | p = subprocess.Popen(cmd, stdout=subprocess.PIPE, 85 | stderr=subprocess.PIPE, 86 | stdin=subprocess.PIPE, shell=True) 87 | (output, err) = p.communicate() 88 | if output != "": 89 | result = output.strip('\r\n') 90 | return result 91 | 92 | -------------------------------------------------------------------------------- /common/BaseTestCase.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | import unittest 5 | import time 6 | import os 7 | import traceback 8 | from Log import * 9 | 10 | 11 | class BaseTestCase(unittest.TestCase): 12 | def __init__(self, methodName='runTest', tester=None): 13 | super(BaseTestCase, self).__init__(methodName) 14 | self.tester = tester 15 | 16 | @staticmethod 17 | def parametrize(testcase_klass, tester=None): 18 | testloader = unittest.TestLoader() 19 | testnames = testloader.getTestCaseNames(testcase_klass) 20 | suite = unittest.TestSuite() 21 | for name in testnames: 22 | suite.addTest(testcase_klass(name, tester=tester)) 23 | return suite 24 | -------------------------------------------------------------------------------- /common/DataProvider.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | import sys 4 | import os 5 | from aetypes import template 6 | 7 | import yaml 8 | from common.Log import * 9 | from model.Device import * 10 | from model.User import * 11 | 12 | 13 | class DataProvider(object): 14 | users = [] 15 | devices = {} 16 | config = None 17 | niceapk = "" 18 | unlockapk = os.getcwd() + "apk/unlock_apk-debug.apk" 19 | settingapk = os.getcwd() + "apk/settings_apk-debug.apk" 20 | imeapk = os.getcwd() + "apk/UnicodeIME-debug.apk" 21 | testers = {} 22 | starttime = {} 23 | stoptime = {} 24 | devicenamelist = [] 25 | 26 | @classmethod 27 | def init_data(cls): 28 | cls.init_config_yaml() 29 | cls.load_devices() 30 | cls.load_users() 31 | cls.load_others_config() 32 | cls.show_devicename_list() 33 | 34 | @classmethod 35 | def init_config_yaml(cls): 36 | filepath = os.path.abspath(os.path.join(os.path.dirname(__file__),"..")) + '/config/config.yaml' 37 | with open(filepath, 'r') as stream: 38 | try: 39 | cls.config = yaml.load(stream) 40 | except yaml.YAMLError as exc: 41 | print 'yaml读取有误' 42 | print exc 43 | finally: 44 | stream.close() 45 | 46 | @classmethod 47 | def load_devices(cls): 48 | cls.devicenamelist = [] 49 | for device in cls.config['Devices']: 50 | deviceobject = Device(device['deviceid']) 51 | deviceobject.devicename = device['devicename'] 52 | deviceobject.serverport = device['serverport'] 53 | deviceobject.bootstrapport = device['bootstrapport'] 54 | deviceobject.platformname = device['platformname'] 55 | deviceobject.platformversion = device['platformversion'] 56 | deviceobject.server = device['server'] 57 | cls.devices[deviceobject.deviceid] = deviceobject 58 | cls.devicenamelist.append(device['devicename']) 59 | Log.logger.info(u"配置列表中一共有 %s 台设备" % len(cls.devices)) 60 | 61 | @classmethod 62 | def load_users(cls): 63 | for user in cls.config['Users']: 64 | userobject = User(user['uid']) 65 | userobject.username = user['username'] 66 | userobject.mobile = user['mobile'] 67 | userobject.password = user['password'] 68 | cls.users.append(userobject) 69 | Log.logger.info(u"配置列表中一共有 %s 个用户信息" % len(cls.users)) 70 | 71 | @classmethod 72 | def load_others_config(cls): 73 | if cls.config['NiceAPK']: 74 | cls.niceapk = cls.config['NiceAPK'] 75 | @classmethod 76 | def show_devicename_list(cls): 77 | for i in range(len(cls.devicenamelist)): 78 | if i % 10 == 0: 79 | print cls.devicenamelist[i] + ',' 80 | i += 1 81 | else: 82 | print cls.devicenamelist[i] + ',', 83 | i += 1 84 | 85 | if __name__ == "__main__": 86 | DataProvider.init_data() 87 | -------------------------------------------------------------------------------- /common/DeviceManager.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | import os 4 | import re 5 | from DataProvider import * 6 | from Log import * 7 | import requests 8 | 9 | 10 | class DeviceManager(object): 11 | 12 | # 连接的设备ID 13 | connectdeviceid = [] 14 | 15 | # 待测的设备对象 16 | testdevices = {} 17 | 18 | # 已建立服务的设备 19 | serverdevices = {} 20 | 21 | # 设备库中未连接的设备 22 | disconnectdevices = {} 23 | 24 | # 连接设备imei 25 | connectimei = [] 26 | 27 | logger = None 28 | 29 | @classmethod 30 | def get_connect_deviceid(cls): 31 | p = os.popen('adb devices') 32 | outstr = p.read() 33 | cls.connectdeviceid = re.findall(r'(\w+)\s+device\s',outstr) 34 | if 0 == len(cls.connectdeviceid): 35 | Log.logger.warn(u'没有adb连接的设备') 36 | else: 37 | return cls.connectdeviceid 38 | 39 | # Server用来获得已链接自己的服务器 40 | @classmethod 41 | def get_test_device(cls): 42 | for deviceid in cls.connectdeviceid: 43 | if DataProvider.devices.has_key(deviceid): 44 | cls.testdevices[deviceid] = DataProvider.devices[deviceid] 45 | else: 46 | Log.logger.warn(u'设备: %s 不在配置列表中' % deviceid) 47 | 48 | if len(cls.testdevices) == 0: 49 | Log.logger.warn(u'没有待测试的设备') 50 | 51 | 52 | # 客户端用来获取server上已经建立好服务的设备 53 | @classmethod 54 | def get_server_test_device(cls): 55 | for deviceid,device in DataProvider.devices.iteritems(): 56 | url = "http://%s:%s/wd/hub" % (device.server,device.serverport) 57 | response = None 58 | try: 59 | response = requests.request("get", url) 60 | except requests.RequestException,e: 61 | pass 62 | if response != None: 63 | cls.serverdevices[deviceid] = device 64 | else: 65 | cls.disconnectdevices[deviceid] = device 66 | 67 | @classmethod 68 | def get_connect_device_imei(cls): 69 | for device in cls.connectdeviceid: 70 | cmd = "adb -s %s shell service call iphonesubinfo 1 | awk -F \"'\" '{print $2}' | sed '1 d' | tr -d '.' | awk '{print}' ORS=" % device 71 | p = os.popen(cmd) 72 | outstr = p.read() 73 | print device, 74 | print outstr 75 | 76 | @classmethod 77 | def get_device_info(cls, deviceId): 78 | mode = "ro.product.model" 79 | release = "ro.build.version.release" 80 | getmode = "adb -s %s shell cat /system/build.prop |grep %s" % (deviceId, mode) 81 | getrelease = "adb -s %s shell cat /system/build.prop |grep %s" % (deviceId, release) 82 | p1 = os.popen(getmode) 83 | p2 = os.popen(getrelease) 84 | modename = p1.read() 85 | releasename = p2.read() 86 | print deviceId 87 | print modename, releasename 88 | 89 | 90 | if __name__ == "__main__": 91 | DeviceManager.get_connect_deviceid() 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /common/DriverManager.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | class DriverManager(object): 5 | 6 | drivers = {} 7 | 8 | #退出所有的Driver 9 | @classmethod 10 | def quit_all_driver(cls): 11 | print cls.drivers 12 | for deviceid,driver in cls.drivers.iteritems(): 13 | if driver != None: 14 | print driver 15 | driver.quit() 16 | 17 | #根据deviceid退出相应的Driver 18 | @classmethod 19 | def quit_driver(cls,deviceid): 20 | if cls.drivers.has_key(deviceid): 21 | if cls.drivers[deviceid] != None: 22 | cls.drivers[deviceid].quit() 23 | -------------------------------------------------------------------------------- /common/HttpServerHandler.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #-*- coding:utf-8 -*- 3 | 4 | import SimpleHTTPServer 5 | from Log import Log 6 | import urlparse 7 | import threading 8 | import json 9 | import re 10 | import share 11 | from RunTestManager import * 12 | 13 | 14 | class HttpServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 15 | 16 | run_manager = None 17 | 18 | def end_headers(self): 19 | self.send_my_headers() 20 | SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self) 21 | 22 | def send_my_headers(self): 23 | self.send_header("Cache-Control", "no-cache, no-store, must-revalidate") 24 | self.send_header("Pragma", "no-cache") 25 | self.send_header("Expires", "0") 26 | 27 | def do_POST(self): 28 | self.logger = Log.logger 29 | self.logger.warning("--------- POST ---------") 30 | 31 | def do_GET(self): 32 | self.logger = Log.logger 33 | self.logger.warning("--------- GET ---------") 34 | self.logger.warning(self.path) 35 | parsedParams = urlparse.urlparse(self.path) 36 | queryParsed = urlparse.parse_qs(parsedParams.query) 37 | 38 | if parsedParams.path == '/run': 39 | self.run(queryParsed) 40 | else: 41 | result_dict = {'code':1001,"data":{"message":"错误的命令"}} 42 | self.set_response(result_dict) 43 | 44 | def run(self, params): 45 | if share.get_if_run() == True: 46 | result_dict = {'code':1002,"data":{"message":"已经有一个任务在执行","taskid":"%s" % share.get_taskid()}} 47 | self.set_response(result_dict) 48 | return 49 | if params.has_key('mode') == False: 50 | result_dict = {'code':1003,"data":{"message":"缺少mode参数"}} 51 | self.set_response(result_dict) 52 | return 53 | elif params['mode'][0] != "monkey" and params['mode'][0] != 'autotest': 54 | self.set_response({'code':1004, "data":{"message":"mode参数错误"}}) 55 | return 56 | 57 | try: 58 | set_run_manager(RunTestManager(params['mode'][0])) 59 | self.taskid = get_run_manager().task_id 60 | share.set_taskid(get_run_manager().task_id) #设置全局共享taskid 61 | share.set_if_run(True) 62 | thread = threading.Thread(target=get_run_manager().start_run) 63 | thread.start() 64 | result_dict = {'code':0,"data":{"taskid fuck":"%s" % self.taskid,"message":"开始执行%s任务" % params['mode']}} 65 | self.set_response(result_dict) 66 | except Exception, e: 67 | traceback.print_exc() 68 | get_run_manager().stop_run() 69 | 70 | def set_response(self, text, code=200): 71 | try: 72 | result = json.dumps(text, ensure_ascii=False) 73 | except Exception, e: 74 | traceback.print_exc() 75 | result = text 76 | self.send_response(code) 77 | self.send_header('Content-Type', 'application/json') 78 | self.end_headers() 79 | self.wfile.write(result) 80 | 81 | 82 | def get_run_manager(): 83 | return HttpServerHandler.run_manager 84 | 85 | 86 | def set_run_manager(value): 87 | HttpServerHandler.run_manager = value -------------------------------------------------------------------------------- /common/Log.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | #-*- coding:utf-8 -*- 3 | 4 | import logging 5 | import datetime 6 | import os 7 | import sys 8 | from logging.handlers import RotatingFileHandler 9 | from PublicMethod import * 10 | 11 | 12 | class Log(object): 13 | 14 | logger = None 15 | 16 | @classmethod 17 | def create_log_file(cls): 18 | logfile = '%s/%s.log' % (os.path.abspath('./log'),get_format_currenttime()) 19 | 20 | cls.logger = logging.getLogger(__name__) 21 | cls.logger.setLevel(logging.DEBUG) 22 | 23 | # 文件handler 24 | filehandle = RotatingFileHandler(logfile, maxBytes=50*1024*1024, backupCount=5, encoding="UTF-8") 25 | formatter = logging.Formatter('%(asctime)s : %(message)s') 26 | filehandle.setFormatter(formatter) 27 | cls.logger.addHandler(filehandle) 28 | 29 | # 屏幕handler 30 | console = logging.StreamHandler() 31 | formatter = logging.Formatter('%(asctime)s : %(message)s') 32 | console.setFormatter(formatter) 33 | cls.logger.addHandler(console) 34 | 35 | if __name__=='__main__': 36 | Log.create_log_file() 37 | Log.logger.debug('this is a debug msg') 38 | Log.logger.info('this is a info msg') 39 | -------------------------------------------------------------------------------- /common/MonkeyResultEmail.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding: utf-8 3 | 4 | from email.mime.multipart import MIMEMultipart 5 | from email.mime.text import MIMEText 6 | from email.mime.image import MIMEImage 7 | from model.Tester import * 8 | from email.header import Header 9 | from email import encoders 10 | from email.header import Header 11 | from email.utils import parseaddr, formataddr 12 | import smtplib 13 | 14 | 15 | def _format_addr(s): 16 | name, addr = parseaddr(s) 17 | return formataddr(( \ 18 | Header(name, 'utf-8').encode(), \ 19 | addr.encode('utf-8') if isinstance(addr, unicode) else addr)) 20 | 21 | 22 | def run(): 23 | sender = 'xxx@163.com' #发送方 24 | receiver = ['xxx@163.com'] #接收方 25 | 26 | # 发送的邮箱服务地址 27 | smtp = smtplib.SMTP_SSL("smtp.exmail.qq.com", port=465) 28 | username = 'xxx@163.com' 29 | password = 'xxxxxx' 30 | 31 | #邮件对象 32 | msgRoot = MIMEMultipart('related') 33 | msgRoot['From'] = _format_addr(u'autotest<%s>' % sender) 34 | for x in receiver: 35 | msgRoot['to'] = _format_addr(u'<%s>' % x) 36 | msgRoot['Subject'] = '[Monkey]%s' % get_format_currenttime() 37 | 38 | #构造附件,即邮件正文 39 | for listdir in Tester.lis: 40 | att = MIMEText(open('%s' % listdir, 'rb').read(), 'base64', 'utf-8') 41 | att["Content-Type"] = 'application/octet-stream' 42 | att["Content-Disposition"] = 'attachment; filename="%s"' % listdir 43 | msgRoot.attach(att) 44 | 45 | smtp.connect('smtp.exmail.qq.com') 46 | smtp.login(username, password) 47 | smtp.sendmail(sender, receiver, msgRoot.as_string()) 48 | smtp.quit() 49 | 50 | if __name__ == '__main__': 51 | run() -------------------------------------------------------------------------------- /common/MonkeyResultWiki.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | 4 | import re 5 | from bs4 import BeautifulSoup 6 | import urllib 7 | import urllib2 8 | import cookielib 9 | from model.Tester import * 10 | from common.PublicMethod import * 11 | 12 | 13 | def login_and_post(loginPage, requestUrl, user, password): 14 | try: 15 | # 设置cookie 16 | cj = cookielib.CookieJar() 17 | opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 18 | opener.addheaders = [('User-agent', 19 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36')] 20 | urllib2.install_opener(opener) 21 | 22 | # 登录 23 | login_data = { 24 | "os_username": user, 25 | "os_password": password, 26 | "os_cookie": "true", 27 | "login": "登录", 28 | "os_destination": ""} 29 | login_data = urllib.urlencode(login_data) 30 | req = urllib2.Request(loginPage, login_data) 31 | conn = urllib2.urlopen(req) 32 | 33 | 34 | # 登录成功后打开指定页面 35 | point_url = urllib2.urlopen(requestUrl).read() 36 | # print point_url 37 | 38 | soup = BeautifulSoup( 39 | point_url, # 文档字符串 40 | 'html.parser', # 解析器 41 | from_encoding='utf-8' # 文档编码 42 | ) 43 | token = soup.find_all('meta', id ='atlassian-token') 44 | token_content=token[0].attrs['content'] 45 | print token_content #获取token值 46 | 47 | draftId = soup.find_all('input', id='draftId') 48 | draftId_result=draftId[0].attrs['value'] 49 | print draftId_result #获取draftId 50 | 51 | entityId = soup.find_all('input', id='entityId') 52 | entityId_result=entityId[0].attrs['value'] 53 | print entityId_result #获取entityId 54 | 55 | # 读取monkey结果Summary.txt文件中的内容 56 | for listdir in Tester.lis: 57 | if 'Summary' in listdir: 58 | file = open(listdir, 'rb') 59 | filedata = file.read() 60 | file.close() 61 | 62 | # 向Android Monkey AutoTest Tracking页面提交form表单数据 63 | pagedata={ 64 | "atl_token": "%s" % token_content, 65 | "fromPageId": "8770164", 66 | "spaceKey": "ANDROID", 67 | "labelsString":"", 68 | "titleWritten":"false", 69 | "linkCreation":"false", 70 | "title":"%s" % get_format_currenttime(), 71 | "wysiwygContent":"%s" % filedata, 72 | "confirm":"Save", 73 | "parentPageString":"Android Monkey AutoTest Tracking", 74 | "moveHierarchy": "true", 75 | "position":"", 76 | "targetId":"", 77 | "draftId":"%s" % draftId_result, 78 | "entityId":"%s" % entityId_result, 79 | "newSpaceKey":"ANDROID" 80 | } 81 | 82 | postdata = urllib.urlencode(pagedata) 83 | Url='http://wiki.niceprivate.com/pages/docreatepage.action' 84 | req2 = urllib2.Request(url=Url, data=postdata) 85 | # 查看表单提交后返回内容 86 | response = urllib2.urlopen(req2) 87 | 88 | except Exception, e: 89 | print str(e) 90 | 91 | 92 | if __name__ == '__main__': 93 | loginUrl = 'xxxxxxx' 94 | user = 'xxxxxx' 95 | password = 'xxxxxx' 96 | requestUrl = 'xxxxxxx' 97 | 98 | # 登录测试 99 | login_and_post(loginUrl, requestUrl, user, password) 100 | 101 | 102 | -------------------------------------------------------------------------------- /common/PreProManager.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | from prepro.ASUSZ00APreProcess import * 4 | from prepro.HTCD826wPreProcess import * 5 | from prepro.HUAWEIMT7PreProcess import * 6 | from prepro.HUAWEIVNSAL00PreProcess import * 7 | from prepro.OPPOA33PreProcess import * 8 | from prepro.OPPON5207PreProcess import * 9 | from prepro.OPPOR8700PreProcess import * 10 | from prepro.OPPOR9PreProcess import * 11 | from prepro.OPPOA37PreProcess import * 12 | from prepro.MZM2NotePreProcess import * 13 | from prepro.RedMiNote2PreProcess import * 14 | from prepro.LeX620PreProcess import * 15 | from prepro.MEITU5PreProcess import * 16 | from prepro.OPPOA59PreProcess import * 17 | from prepro.RedMiNote3PreProcess import * 18 | from prepro.RedMiNote4PreProcess import * 19 | from prepro.SumSingS4PreProcess import * 20 | from prepro.XIAOMINOTEPreProcess import * 21 | from prepro.LianXiangK30TPreProcess import * 22 | from prepro.SumSingNote3PreProcess import * 23 | from prepro.XIAOMI5PreProcess import * 24 | from prepro.M57APreProcess import * 25 | from prepro.XIAOMI2PreProcess import * 26 | from prepro.XIAOMI3PreProcess import * 27 | from prepro.HUIWEIP6PreProcess import * 28 | from prepro.MEIZU4PROPreProcess import * 29 | from prepro.M3notePreProcess import * 30 | from prepro.HTCBFPreProcess import * 31 | from prepro.HTCONEPreProcess import * 32 | from prepro.Nexus6PreProcess import * 33 | from prepro.MEITUM4PreProcess import * 34 | from prepro.VIVOX5ProPreProcess import * 35 | from prepro.OPPOR7sPreProcess import * 36 | from prepro.VIVOV3MAXPreProecss import * 37 | from prepro.MZM1notePreProcess import * 38 | from prepro.ONEPlusXPreProcess import * 39 | from prepro.SumSing9152PreProcess import * 40 | from prepro.VivoX7PreProcess import * 41 | from prepro.HuaWeiG9PreProcess import * 42 | from prepro.XIAOMI4PreProcess import * 43 | from prepro.RedMi1sPreProcess import * 44 | from prepro.SumSingNote4PreProcess import * 45 | from prepro.Smartisan705PreProcess import * 46 | from prepro.Smartisan1PreProcess import * 47 | from prepro.Coopad8765PreProcess import * 48 | from prepro.Coopad8729blackPreprocess import * 49 | from prepro.Coopad8729PreProcess import * 50 | from prepro.MX5PreProcess import * 51 | from prepro.HuaWeiJAZZProPrecess import * 52 | from prepro.LianXiang5860PreProcess import * 53 | from prepro.RedMi2APreProcess import * 54 | from prepro.ChuiZi_YQ607PreProcess import * 55 | 56 | class PreProManager(object): 57 | 58 | def __init__(self, tester): 59 | self.tester = tester 60 | self.deviceid = self.tester.device.deviceid 61 | 62 | def device(self): 63 | if self.deviceid == "5HUC9S6599999999": 64 | return OPPOR9PreProcess(self.tester) 65 | elif self.deviceid =="7c404969": 66 | return OPPOA33PreProcess(self.tester) 67 | elif self.deviceid == "G6Q4U4EA99999999": 68 | return OPPOA37PreProcess(self.tester) 69 | elif self.deviceid == "810EBL22MGP3": 70 | return MZM2NotePreProcess(self.tester) 71 | elif self.deviceid == "LJYTZ5D699999999": 72 | return RedMiNote2PreProcess(self.tester) 73 | elif self.deviceid == "LE66A06250102401": 74 | return LeX620PreProcess(self.tester) 75 | elif self.deviceid == "MIAGLMC6A2100083": 76 | return MEITU5PreProcess(self.tester) 77 | elif self.deviceid == "RCKVVCSO99999999": 78 | return OPPOA59PreProcess(self.tester) 79 | elif self.deviceid == "4TEI7DK799999999": 80 | return RedMiNote3PreProcess(self.tester) 81 | elif self.deviceid == "4d00f31dba19a02d": 82 | return SumSingS4PreProcess(self.tester) 83 | elif self.deviceid == "a42516eb": 84 | return XIAOMINOTEPreProcess(self.tester) 85 | elif self.deviceid == "bef9e460": 86 | return LianXiangK30TPreProcess(self.tester) 87 | elif self.deviceid == 'ee72d34d': 88 | return SumSingNote3PreProcess(self.tester) 89 | elif self.deviceid == 'b33aa57c': 90 | return XIAOMI5PreProcess(self.tester) 91 | elif self.deviceid == 'A10ABNN76XMP': 92 | return M57APreProcess(self.tester) 93 | elif self.deviceid == '4c4bb164': 94 | return XIAOMI2PreProcess(self.tester) 95 | elif self.deviceid == '0021119e': 96 | return XIAOMI3PreProcess(self.tester) 97 | elif self.deviceid == '022BTF7N43046595': 98 | return HUAWEIP6PreProcess(self.tester) 99 | elif self.deviceid == '76UBBKR224R8': 100 | return MEIZU4PROPreProcess(self.tester) 101 | elif self.deviceid == '91QEBPL694VC': 102 | return M3notePreProcess(self.tester) 103 | elif self.deviceid == 'HT53WWZ02029': 104 | return HTCBFPreProcess(self.tester) 105 | elif self.deviceid == 'HT53DYJ00008': 106 | return HTCONEPreProcess(self.tester) 107 | elif self.deviceid == 'K21GAMN5A1901310': 108 | return MEITUM4PreProcess(self.tester) 109 | elif self.deviceid == 'ZX1G22HQSB': 110 | return Nexus6PreProcess(self.tester) 111 | elif self.deviceid == 'VCOZHE6L99999999': 112 | return VIVOX5ProPreProcess(self.tester) 113 | elif self.deviceid == 'HEPBPF4D49S4FUGY': 114 | return OPPOR7sPreProcess(self.tester) 115 | elif self.deviceid == '174034d3': 116 | return VIVOV3MAXPreProcess(self.tester) 117 | elif self.deviceid == '91QEBP63ULCD': 118 | return M3notePreProcess(self.tester) 119 | elif self.deviceid == '179323c4': 120 | return Coopad8729PreProcess(self.tester) 121 | elif self.deviceid == '71MBBL622EG3': 122 | return MZM1notePreProcess(self.tester) 123 | elif self.deviceid == '27ba3598': 124 | return ONEPlusXPreProcess(self.tester) 125 | elif self.deviceid == '410ac5dd9036c000': 126 | return SumSing9152PreProcess(self.tester) 127 | elif self.deviceid == '8d994efc': 128 | return VivoX7ProPreProcess(self.tester) 129 | elif self.deviceid == '3DN4C16411014042': 130 | return HuaWeiG9PreProcess(self.tester) 131 | elif self.deviceid == 'CC53DYG03271': 132 | return HTCD826wPreProcess(self.tester) 133 | elif self.deviceid == 'b3e5b28e': 134 | return XIAOMI4PreProcess(self.tester) 135 | elif self.deviceid == 'e80c9403': 136 | return RedMi1sPreProcess(self.tester) 137 | elif self.deviceid == '8526c60c': 138 | return SumSingNote4PreProcess(self.tester) 139 | elif self.deviceid == 'P4M0215418001139': 140 | return HUAWEIMT7PreProcess(self.tester) 141 | elif self.deviceid == 'd9b28b5c': 142 | return Smartisan705Process(self.tester) 143 | elif self.deviceid == 'F8AZFG01U429': 144 | return ASUSZ00APreProcessPreProcess(self.tester) 145 | elif self.deviceid == 'ZLWOUCWKLNT4AMKN': 146 | return RedMiNote4PreProcess(self.tester) 147 | elif self.deviceid == '8c9847a5': 148 | return Smartosan1PreProcess(self.tester) 149 | elif self.deviceid == '54da7023': 150 | return OPPON5207PreProcess(self.tester) 151 | elif self.deviceid == '9418d864': 152 | return OPPOR8700PreProcess(self.tester) 153 | elif self.deviceid == '2a2ac28': 154 | return Coopad8765PreProcess(self.tester) 155 | elif self.deviceid == 'b8939c4': 156 | return Coopad8729blackPreprocess(self.tester) 157 | elif self.deviceid == '179323c4': 158 | return Coopad8729PreProcess(self.tester) 159 | elif self.deviceid == '85UABM7HEBC2': 160 | return MX5PreProcess(self.tester) 161 | elif self.deviceid == 'd0a9661f': 162 | return Smartosan1PreProcess(self.tester) 163 | elif self.deviceid == 'V6V7N14C01000156': 164 | return HuaWeiJAZZProPrecess(self.tester) 165 | elif self.deviceid == 'HGC9GXBJ': 166 | return LianXiang5860PreProcess(self.tester) 167 | elif self.deviceid == '6O5528A28423': 168 | return RedMi2APreProcess(self.tester) 169 | elif self.deviceid == 'e249ecb3': 170 | return ChuiZi_YQ607PreProcess(self.tester) -------------------------------------------------------------------------------- /common/PublicMethod.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | import datetime 5 | import os 6 | import re 7 | 8 | 9 | def get_format_currenttime(): 10 | currenttime = datetime.datetime.now().strftime("%Y_%m_%d_%H:%M:%S") 11 | return currenttime 12 | 13 | 14 | def get_fullfile_from_path(path, ext=None): 15 | allfiles = [] 16 | needExtFilter = (ext != None) 17 | for root, dirs, files in os.walk(path): 18 | for filespath in files: 19 | filepath = os.path.join(root, filespath) 20 | extension = os.path.splitext(filepath)[1][1:] 21 | if needExtFilter and extension in ext: 22 | allfiles.append(filepath) 23 | elif not needExtFilter: 24 | allfiles.append(filepath) 25 | return allfiles 26 | 27 | 28 | def get_file_name_from_path(path, ext=None): 29 | allfilenames = [] 30 | needExtFilter = (ext != None) 31 | for root, dirs, files in os.walk(path): 32 | for filespath in files: 33 | filename, suffix = os.path.splitext(filespath) 34 | extension = os.path.splitext(filespath)[1][1:] 35 | if needExtFilter and extension in ext: 36 | allfilenames.append(filename) 37 | elif not needExtFilter: 38 | allfilenames.append(filename) 39 | return allfilenames 40 | 41 | 42 | def clean_brackets_from_str(string): 43 | final_string = re.sub(r'[\((][\s\S]*[\))]', "", string) 44 | return final_string 45 | 46 | 47 | def read_file(filename, mode): 48 | f = open(filename, mode) # filename,文件路径、名称,如果有\,注意转义或者开头加r,mode读取的模式,r读取,w写入,, 49 | read = f.read() # 获取内容并储存在变量里 50 | print read 51 | f.close() # 关闭文件,节省内存 52 | 53 | -------------------------------------------------------------------------------- /common/RunTestManager.py: -------------------------------------------------------------------------------- 1 | #usr/bin/python 2 | #-*- coding:utf-8 -*- 3 | 4 | from appium import webdriver 5 | import MonkeyResultEmail 6 | import share 7 | from common.DeviceManager import * 8 | from common.PreProManager import * 9 | from common.TestCaseManager import * 10 | from common.TheTestResult import * 11 | import MonkeyResultWiki 12 | import traceback 13 | 14 | 15 | class RunTestManager(object): 16 | 17 | def __init__(self, mode): 18 | self.count_testcases = 0 19 | self.task_id = int(time.time()) 20 | self.logger = Log.logger 21 | self.mode = mode 22 | 23 | def start_run(self): 24 | try: 25 | self.logger.debug('Start run %s...' % self.mode) 26 | if self.mode == "autotest": 27 | TheTestResult.create_result_folder() 28 | 29 | if self.mode == "monkey": 30 | Tester.is_exit_monkeyresultfile() 31 | Tester.create_monkey_result() 32 | 33 | Log.logger.info(u"开始执行任务...") 34 | self.start_run_test() 35 | 36 | if self.mode == "autotest": 37 | Log.logger.debug(u'开始生成测试报告...') 38 | TheTestResult.generate_html_testresult() 39 | 40 | if self.mode == "monkey": 41 | #读取本次monkey结果文件夹下的所有log 42 | Tester.open_filelist() 43 | Tester.read_log() 44 | time.sleep(10) 45 | MonkeyResultWiki.login_and_post("参数") 46 | MonkeyResultEmail.run() 47 | 48 | Log.logger.info(u"完成测试并退出所有Driver") 49 | # DriverManager.quit_all_driver() 50 | self.stop_run() 51 | except Exception, e: 52 | traceback.print_exc() 53 | self.stop_run() 54 | 55 | def stop_run(self): 56 | share.set_if_run(False) 57 | 58 | def run(self, tester): 59 | try: 60 | DataProvider.starttime[tester.device.deviceid] = get_format_currenttime() 61 | tester.show_relationship() 62 | # 开始设备预处理流程 63 | if PreProManager(tester).device().pre_process(): 64 | if self.mode == "monkey": 65 | Log.logger.info(u"设备:%s ---开始执行monkey---" % tester.device.devicename) 66 | suite = TestCaseManager(tester).monkey_android() 67 | Log.logger.info(u"设备:%s ---monkey执行结束---" % tester.device.devicename) 68 | 69 | elif self.mode == "autotest": 70 | tester.clean_mp4_file() #清理sd卡DCIM文件夹中的mp4文件 71 | Log.logger.info(u"设备:%s ---开始执行autotest---" % tester.device.devicename) 72 | tester.pic_data_prepare() #判断手机是否有autotest图库 73 | tester.video_data_prepare() # 判断手机是否有auto_video视频 74 | Log.logger.info(u"设备:%s 开始Load测试用例..." % tester.device.devicename) 75 | suite = TestCaseManager(tester).compatibility_testsuite() 76 | #suite = TestCaseManager(tester).signal_case_suit(test_show_pub_video) 77 | Log.logger.info(u"设备:%s 测试用例Load完成" % tester.device.devicename) 78 | Log.logger.info(u"设备:%s 开始执行测试用例..." % tester.device.devicename) 79 | unittest.TextTestRunner(verbosity=2, resultclass=TheTestResult).run(suite) 80 | Log.logger.info(u"设备:%s 测试用例执行完成" % tester.device.devicename) 81 | else: 82 | Log.logger.info(u"设备:%s 预处理流程失败,终止相应任务" % tester.device.devicename) 83 | 84 | DataProvider.stoptime[tester.device.deviceid] = get_format_currenttime() 85 | 86 | except Exception,e: 87 | Log.logger.info(u"设备:%s 出现异常" % tester.device.devicename) 88 | traceback.print_exc() 89 | 90 | def init_tester_data(self, device, which_user): 91 | try: 92 | desired_caps = {} 93 | desired_caps['platformName'] = device.platformname 94 | desired_caps['platformVersion'] = device.platformversion 95 | desired_caps['deviceName'] = device.devicename 96 | desired_caps['unicodeKeyboard'] = "true" 97 | desired_caps['resetKeyboard'] = 'true' 98 | desired_caps['autoLaunch'] = "false" 99 | desired_caps['appPackage'] = 'com.nice.main' 100 | desired_caps['appActivity'] = 'com.nice.main.activities.MainActivity_' 101 | desired_caps['udid'] = device.deviceid 102 | desired_caps['newCommandTimeout'] = "3000" 103 | desired_caps['unicodeKeyboard'] = True 104 | desired_caps['resetKeyboard'] = True 105 | url = "http://%s:%s/wd/hub" % (device.server, device.serverport) 106 | driver = webdriver.Remote(url, desired_caps) 107 | 108 | if self.mode=="autotest": 109 | # 创建每个设备的截图文件夹 110 | folderpath = '%s/%s' % (TheTestResult.testresultpath, device.devicename) 111 | os.mkdir(folderpath) 112 | 113 | testerobject = Tester(driver) 114 | testerobject.device = device 115 | testerobject.user = DataProvider.users[which_user] 116 | testerobject.logger = Log.logger 117 | if self.mode=="autotest": 118 | testerobject.screenshot_path = folderpath 119 | 120 | DriverManager.drivers[device.deviceid] = driver 121 | return testerobject 122 | except Exception,e: 123 | Log.logger.info(u"设备:%s 出现异常" % device.devicename) 124 | traceback.print_exc() 125 | 126 | def start_run_test(self): 127 | which_user = 0 128 | threads = [] 129 | for deviceid, device in DeviceManager.serverdevices.iteritems(): 130 | testerobject = self.init_tester_data(device, which_user) 131 | DataProvider.testers[device.deviceid] = testerobject 132 | try: 133 | thread = threading.Thread(target=self.run, args=(testerobject,)) 134 | thread.start() 135 | which_user = which_user + 1 136 | threads.append(thread) 137 | except Exception, e: 138 | traceback.print_exc() 139 | DataProvider.testers[deviceid].driver.quit() 140 | 141 | for thread in threads: 142 | thread.join() -------------------------------------------------------------------------------- /common/TestCaseManager.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | from BaseTestCase import * 4 | from model.Device import * 5 | 6 | 7 | class TestCaseManager(object): 8 | 9 | def __init__(self, tester): 10 | self.compatibility_suite = unittest.TestSuite() 11 | self.testcase_class = [] 12 | self.load_case() 13 | self.tester = tester 14 | 15 | def load_case(self): 16 | testcase_array = [] 17 | testsuits = unittest.defaultTestLoader.discover('testcase/', pattern='test*.py') 18 | for testsuite in testsuits: 19 | for suite in testsuite._tests: 20 | for test in suite: 21 | testcase_array.append(test.__class__) 22 | self.testcase_class = sorted(set(testcase_array), key=testcase_array.index) 23 | 24 | # 兼容性测试用例 25 | def compatibility_testsuite(self): 26 | for testcase in self.testcase_class: 27 | self.compatibility_suite.addTest(BaseTestCase.parametrize(testcase, tester=self.tester)) 28 | return self.compatibility_suite 29 | 30 | #monkey自动化 31 | def monkey_android(self): 32 | self.tester.run_monkey(200,1000) 33 | 34 | # 功能性测试用例 35 | def functional_testsuite(self): 36 | pass 37 | 38 | def signal_case_suit(self, test_myclass): 39 | suite = unittest.TestSuite() 40 | suite.addTest(BaseTestCase.parametrize(test_myclass, tester=self.tester)) 41 | return suite 42 | -------------------------------------------------------------------------------- /common/TheTestResult.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | import re 4 | import sys 5 | 6 | from common.ApkBase import ApkInfo 7 | 8 | reload(sys) 9 | sys.setdefaultencoding('utf-8') 10 | import unittest 11 | from pyh import * 12 | import collections 13 | from datetime import datetime 14 | import traceback 15 | from DriverManager import * 16 | from DataProvider import * 17 | 18 | 19 | class TheTestResult(unittest.TestResult): 20 | 21 | detailresults = {} #{"5HUC9S6599999999":{},"":{}} 22 | totalresults = {} 23 | device = {} 24 | testresultpath = "" 25 | filecss = "" 26 | filejs = "" 27 | 28 | def __init__(self, stream=None, descriptions=None, verbosity=None): 29 | unittest.TestResult.__init__(self, stream=None, descriptions=None, verbosity=None) 30 | self.logger = Log.logger 31 | self._testcasedict = collections.OrderedDict() 32 | self.if_write_starttime = False 33 | 34 | def startTest(self, test): 35 | self.tester = test.tester 36 | self.deviceid = self.tester.device.deviceid 37 | testcase_starttime = get_format_currenttime() 38 | self.logger.debug(u'设备:%s Start Run %s' % (self.tester.device.devicename, test)) 39 | print test.id() 40 | 41 | #初始化每个设备总结果的数据结构 42 | if self.__class__.totalresults.has_key(self.deviceid): 43 | pass 44 | else: 45 | self.__class__.totalresults[self.deviceid] = collections.OrderedDict() 46 | self.__class__.totalresults[self.deviceid]['totalrun'] = 0 47 | self.__class__.totalresults[self.deviceid]['startime'] = 0 48 | self.__class__.totalresults[self.deviceid]['stoptime'] = 0 49 | self.__class__.totalresults[self.deviceid]['errortestcase'] = 0 50 | self.__class__.totalresults[self.deviceid]['failtestcase'] = 0 51 | self.__class__.totalresults[self.deviceid]['skiptestcase'] = 0 52 | self.__class__.totalresults[self.deviceid]['successtestcase'] = 0 53 | 54 | #总用例数 55 | self.__class__.totalresults[self.deviceid]['totalrun'] = self.__class__.totalresults[self.deviceid]['totalrun'] + 1 56 | 57 | #开始时间 58 | if self.if_write_starttime: 59 | pass 60 | else: 61 | self.__class__.totalresults[self.deviceid]['starttime'] = testcase_starttime 62 | self.if_write_starttime = True 63 | 64 | #每个设备的详细执行结果 65 | self._testcasedict[test] = collections.OrderedDict() 66 | if self.__class__.detailresults.has_key(self.deviceid): 67 | pass 68 | else: 69 | self.__class__.device[self.deviceid] = self.tester.device 70 | self.__class__.detailresults[self.deviceid] = self._testcasedict 71 | self.__class__.detailresults[self.deviceid][test]['startime'] = testcase_starttime 72 | 73 | 74 | def stopTest(self, test): 75 | testcase_stoptime = get_format_currenttime() 76 | self.logger.debug(u'设备:%s Stop Run %s' % (self.tester.device.devicename, test)) 77 | self.__class__.detailresults[self.deviceid][test]['stoptime'] = testcase_stoptime 78 | testcase_consumingtime = self.__class__.get_time_consuming(self.__class__.detailresults[self.deviceid][test]['startime'] 79 | , self.__class__.detailresults[self.deviceid][test]['stoptime']) 80 | self.__class__.detailresults[self.deviceid][test]['consumingtime'] = testcase_consumingtime 81 | self.__class__.totalresults[self.deviceid]['stoptime'] = testcase_stoptime 82 | 83 | 84 | def startTestRun(self): 85 | # self.logger.debug('测试开始...') 86 | pass 87 | 88 | def stopTestRun(self): 89 | # self.logger.debug('测试完成...') 90 | pass 91 | 92 | def addError(self, test, err): 93 | info = '************ - %s -!(Error) ***************' % self.tester.device.devicename 94 | self.logger.warning(info) 95 | #traceback.print_tb(err[2]) 96 | traceback.print_exc() 97 | info = 'Error device:%s Run TestCase %s, Error info:%s' % (self.tester.device.devicename, test, traceback.format_exception(err[0], err[1], err[2])) 98 | self.logger.error(info) 99 | info = '************************************************' 100 | self.logger.warning(info) 101 | 102 | # 错误截图 103 | mytest = str(test) 104 | simplename = clean_brackets_from_str(mytest).replace(' ', '') 105 | myscr = "Error_%s" % simplename 106 | self.tester.screenshot2(myscr) 107 | 108 | # 错误日志 109 | list = traceback.format_exception(err[0], err[1], err[2]) 110 | list_err = [] # 列表包含要输出的错误日志信息 111 | list_err.append(list[-1]) 112 | list_err.append(list[2]) 113 | 114 | if self.__class__.totalresults.has_key(self.deviceid): 115 | self.__class__.totalresults[self.deviceid]['errortestcase'] = self.__class__.totalresults[self.deviceid]['errortestcase'] + 1 116 | else: 117 | self.__class__.totalresults[self.deviceid]['errortestcase'] = 0 118 | 119 | try: 120 | self.__class__.detailresults[self.deviceid][test]['result'] = 'Error' 121 | self.__class__.detailresults[self.deviceid][test]['reason'] = list_err 122 | except Exception, e: 123 | info = Exception, ":", e 124 | self.logger.error(info) 125 | 126 | def addFailure(self, test, err): 127 | info = '************ - %s -!(Fail) ***************' % self.tester.device.devicename 128 | self.logger.warning(info) 129 | info = 'Fail device:%s Run TestCase %s, Fail info:%s' % (self.tester.device.devicename, test, err[1].message) 130 | self.logger.warning(info) 131 | info = '***********************************************' 132 | self.logger.warning(info) 133 | 134 | # 失败截图 135 | mytest = str(test) 136 | simplename = clean_brackets_from_str(mytest).replace(' ', '') 137 | myscr = "Failure_%s" % simplename 138 | self.tester.screenshot2(myscr) 139 | 140 | # 失败日志 141 | list = traceback.format_exception(err[0], err[1], err[2]) 142 | list_fail = [] # 列表包含要输出的错误日志信息 143 | list_fail.append(list[-1]) 144 | list_fail.append(list[2]) 145 | 146 | self.__class__.totalresults[self.deviceid]['failtestcase'] = self.__class__.totalresults[self.deviceid]['failtestcase'] + 1 147 | 148 | self.__class__.detailresults[self.deviceid][test]['result'] = 'Fail' 149 | self.__class__.detailresults[self.deviceid][test]['reason'] = list_fail 150 | 151 | def addSuccess(self, test): 152 | self.__class__.totalresults[self.deviceid]['successtestcase'] = self.__class__.totalresults[self.deviceid]['successtestcase'] + 1 153 | 154 | self.__class__.detailresults[self.deviceid][test]['result'] = 'Success' 155 | self.__class__.detailresults[self.deviceid][test]['reason'] = u'无' 156 | 157 | def addSkip(self, test, reason): 158 | info = '→_→Skip Run TestCase %s, Skip reason:%s' % (test ,reason) 159 | self.logger.debug(info) 160 | self.__class__.totalresults[self.deviceid]['skiptestcase'] = self.__class__.totalresults[self.deviceid]['skiptestcase'] + 1 161 | 162 | self.__class__.detailresults[self.deviceid][test]['result'] = 'Skip' 163 | self.__class__.detailresults[self.deviceid][test]['reason'] = reason 164 | 165 | @classmethod 166 | def get_time_consuming(cls, starttime, endtime): 167 | starttime = datetime.datetime.strptime(starttime, "%Y_%m_%d_%H:%M:%S") 168 | endtime = datetime.datetime.strptime(endtime, "%Y_%m_%d_%H:%M:%S") 169 | timeconsuming = endtime - starttime 170 | 171 | if timeconsuming.seconds <= 0: 172 | timestr = '<1秒' 173 | else: 174 | timestr = '%s 秒' % timeconsuming.seconds 175 | return timestr 176 | 177 | @classmethod 178 | def create_result_folder(cls): 179 | cls.testresultpath = os.getcwd()+'/testresult/%s' % get_format_currenttime() 180 | os.mkdir(cls.testresultpath) 181 | 182 | # css文件路径 183 | filecss = os.getcwd()+'/testresult/result.css' 184 | # js文件路径 185 | filejs = os.getcwd()+'/testresult/result.js' 186 | # js文件路径 187 | sorttablejs = os.getcwd()+'/testresult/sorttable.js' 188 | 189 | @classmethod 190 | def generate_html_testresult(cls): 191 | page = PyH('测试报告') 192 | result_title = "nice Auto Test Report" 193 | 194 | # 增加css样式及js脚本 195 | page.addCSS(cls.filecss) 196 | page.addJS(cls.filejs) 197 | page.addJS(cls.sorttablejs) 198 | homediv = page << div(id='nice_report', cl='nice_header_passed') 199 | reporttitle = homediv << div(result_title, id='title') 200 | 201 | # 获取apk信息 202 | apk_name = ApkInfo().get_apk_pkg() 203 | apk_version_name = ApkInfo().get_apk_version_name() 204 | apk_version_code = ApkInfo().get_apk_version_code() 205 | 206 | # 展示apk相关信息 207 | reportsummary = homediv << div(id='summary') 208 | reportsummary << p(apk_name) 209 | reportsummary << p(apk_version_code) 210 | reportsummary << p(apk_version_name) 211 | 212 | tabdiv = page << div(id="Tab1") 213 | menuboxdiv = tabdiv << div(cl="Menubox") 214 | contentdiv = tabdiv << div(cl="Contentbox") 215 | 216 | tabul = menuboxdiv << ul() 217 | index = 1 218 | size = len(cls.detailresults) 219 | for deviceid, testresult in cls.detailresults.iteritems(): 220 | tabstr = "setTab('one',%s, %s)" % (index, size) 221 | liid = "one%s" % index 222 | if index == 1: 223 | tabul << li(cls.device[deviceid].devicename, id=liid, onmouseover=tabstr, cl="hover") 224 | else: 225 | tabul << li(cls.device[deviceid].devicename, id=liid, onmouseover=tabstr) 226 | 227 | content_div_id = "con_one_%s" % index 228 | if index == 1: 229 | detaildiv = contentdiv << div(id=content_div_id, cl="hover") 230 | else: 231 | detaildiv = contentdiv << div(id=content_div_id, style="display:none") 232 | 233 | totaldiv = detaildiv << div(id='Total') 234 | totallabel = totaldiv << p('设备总结果:',align="left") 235 | totalresulttable = totaldiv << table(cl='totalResult', border="1", cellpadding="15") 236 | # totalresulttable.attributes['class'] = 'totalResult' 237 | result_title_tr = totalresulttable << tr() 238 | result_value_tr = totalresulttable << tr() 239 | ordertitle = collections.OrderedDict() 240 | timeconsuming = cls.get_time_consuming(cls.totalresults[deviceid]['starttime'], cls.totalresults[deviceid]['stoptime']) 241 | ordertitle[u'开始时间'] = DataProvider.starttime[deviceid] 242 | try: 243 | ordertitle[u'结束时间'] = DataProvider.stoptime[deviceid] 244 | except: 245 | ordertitle[u'结束时间'] = ordertitle[u'开始时间'] 246 | Log.logger.debug('%s stoptime: connect error, use default time instead' % cls.device[deviceid].devicename) 247 | 248 | ordertitle[u'总耗时'] = timeconsuming 249 | ordertitle[u'总用例数'] = cls.totalresults[deviceid]['totalrun'] 250 | ordertitle[u'成功用例数'] = cls.totalresults[deviceid]['successtestcase'] 251 | ordertitle[u'失败用例数'] = cls.totalresults[deviceid]['failtestcase'] 252 | ordertitle[u'错误用例数'] = cls.totalresults[deviceid]['errortestcase'] 253 | ordertitle[u'跳过用例数'] = cls.totalresults[deviceid]['skiptestcase'] 254 | 255 | for title, value in ordertitle.iteritems(): 256 | result_title_tr << td(title) 257 | temp = result_value_tr << td(value) 258 | temp.attributes['class'] = title 259 | 260 | detaillabel = detaildiv << p('详细执行结果:',align="left") 261 | detail_table_title = (u'测试用例', u'开始时间', u'结束时间', u'耗时', u'测试结果', u'原因') 262 | detailresulttable = detaildiv << table(cl='sortable', width="100%", border="1", cellpadding="2", cellspacing="1", style="table-layout:fixed") 263 | detail_title_tr = detailresulttable << tr() 264 | for title in detail_table_title: 265 | detail_title_tr << td(title) 266 | for key, values in cls.detailresults[deviceid].iteritems(): 267 | testcasetr = detailresulttable << tr() 268 | mykey = str(key) 269 | final_key = clean_brackets_from_str(mykey) 270 | testcasetr << td(final_key, align='left',width="100%",style="word-break:break-all") 271 | testcasetr << td(values['startime']) 272 | testcasetr << td(values['stoptime']) 273 | testcasetr << td(values['consumingtime']) 274 | try: 275 | testcasetr << td(values['result']) 276 | except: 277 | testcasetr << td('device connect error') 278 | Log.logger.debug('%s result: device connect error, use default values instead' % cls.device[deviceid].devicename) 279 | try: 280 | testcasetr << td(values['reason'], width="100%", style="word-break:break-all") 281 | except: 282 | testcasetr << td('session error') 283 | Log.logger.debug('%s reason: device connect error, use default values instead' % cls.device[deviceid].devicename) 284 | 285 | # 截图展示 286 | # 创建新div标签,并赋予id 287 | screencaplable = detaildiv << div(id='screencap') 288 | 289 | # 添加说明 290 | screencapdiv = detaildiv << p('截图验证:', align="left") 291 | 292 | # 获取截图文件名及绝对路径 293 | screecap_path = "%s/%s/" % (cls.testresultpath, cls.device[deviceid].devicename) 294 | screencap_table_title = get_file_name_from_path(screecap_path, 'png') 295 | screencap_img_src = get_fullfile_from_path(screecap_path, 'png') 296 | 297 | # 创建table 298 | screencapresulttable = screencapdiv << table(width="auto", border="1", cellpadding="2", cellspacing="1", 299 | style="table-layout:fixed") 300 | 301 | # 描述'title' 302 | screencap_title_tr = screencapresulttable << tr() 303 | # 描述'内容' 304 | screencap = screencapresulttable << tr() 305 | 306 | # 循环写入截图名及对应截图 307 | for title in screencap_table_title: 308 | screencap_title_tr << td(title) 309 | for path in screencap_img_src: 310 | screencap << td("%s " % (path, title)) 311 | 312 | # 视频展示 313 | # 创建新div标签,并赋予id 314 | screenrecordlable = detaildiv << div(id='screenrecord') 315 | screenrecorddiv = detaildiv << p('视频验证:', align="left") 316 | 317 | # 获取视频名字及绝对路径 318 | screerecord_path = "%s/%s/" % (cls.testresultpath, cls.device[deviceid].devicename) 319 | screenrecord_table_title = get_file_name_from_path(screerecord_path, 'mp4') 320 | screenrecord_video_src = get_fullfile_from_path(screerecord_path, 'mp4') 321 | 322 | # 创建table 323 | screenrecordresulttable = screenrecorddiv << table(width="auto", border="1", cellpadding="2", cellspacing="1", 324 | style="table-layout:fixed") 325 | # 描述'title' 326 | screenrecord_title_tr = screenrecordresulttable << tr() 327 | # 描述'内容' 328 | screenrecord = screenrecordresulttable << tr() 329 | 330 | # 循环写入截图名及对应截图 331 | for title_video in screenrecord_table_title: 332 | screenrecord_title_tr << td(title_video) 333 | for path_video in screenrecord_video_src: 334 | screenrecord << td("" % path_video) 336 | 337 | # 添加错误截图信息 338 | errorlable = detaildiv << div(id='errorrecord') 339 | errordiv = detaildiv << p('错误截图:', align="left") 340 | 341 | error_path = "%s/%s/" % (cls.testresultpath, cls.device[deviceid].devicename) 342 | error_table_title = get_file_name_from_path(error_path, 'jpg') 343 | error_src = get_fullfile_from_path(screerecord_path, 'jpg') 344 | 345 | # 创建table 346 | errorresulttable = errordiv << table(width="auto", border="1", cellpadding="2", 347 | cellspacing="1", 348 | style="table-layout:fixed") 349 | 350 | error_title = errorresulttable << tr() 351 | error_valus = errorresulttable << tr() 352 | 353 | # 循环写入截图名及对应截图 354 | for title_error in error_table_title: 355 | error_title << td(title_error) 356 | for path_error in error_src: 357 | error_valus << td("%s " % (path_error, title)) 358 | 359 | 360 | # 循环添加各个设备的tab 361 | index = index + 1 362 | 363 | #生成测试结果Html文件 364 | htmltestresultfile = '%s/%s.html' % (cls.testresultpath, get_format_currenttime()) 365 | try: 366 | page.printOut(htmltestresultfile) 367 | except IOError: 368 | Log.logger.error('file %s not exist' % htmltestresultfile) 369 | DriverManager.quit_all_driver() 370 | 371 | else: 372 | Log.logger.debug(u'测试报告创建成功,路径:%s' % htmltestresultfile) 373 | 374 | 375 | if __name__ == '__main__': 376 | TheTestResult().generate_html_testresult() 377 | -------------------------------------------------------------------------------- /common/__init__.py: -------------------------------------------------------------------------------- 1 | __author__ = 'John_Hao' 2 | -------------------------------------------------------------------------------- /common/share.py: -------------------------------------------------------------------------------- 1 | # usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | import Log 4 | 5 | class global_var: 6 | 7 | run_mode = 'autotest' #monkey 8 | 9 | if_run = False # 当时是否有运行的任务 10 | 11 | task_id = 0 # 当前的任务id 12 | 13 | def set_run_mode(value): 14 | global_var.run_mode = value 15 | 16 | 17 | def get_run_mode(): 18 | return global_var.run_mode 19 | 20 | 21 | def set_if_run(value): 22 | global_var.if_run = value 23 | 24 | 25 | def get_if_run(): 26 | return global_var.if_run 27 | 28 | 29 | def set_taskid(value): 30 | global_var.task_id = value 31 | 32 | 33 | def get_taskid(): 34 | return global_var.task_id 35 | 36 | -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- 1 | __author__ = 'John_Hao' -------------------------------------------------------------------------------- /config/config.yaml: -------------------------------------------------------------------------------- 1 | NiceAPK: /Users/xxxxx/nice.apk # 测试包的路径 2 | 3 | Devices: 4 | - deviceid: 5HUC9S6599999999 # 设备识别adb devices的值 5 | devicename: OPPO_R9M # 设备的名称,用于区分 6 | serverport: 4723 # -p Appium的主要端口,设备之间不能重复 7 | bootstrapport: 4823 # -bp Appium bootstrap端口,设备之间不能重复 8 | platformname: Android # desired_caps 9 | platformversion: 5.1 # desired_caps 10 | server: 127.0.0.1 # 地址 11 | 12 | - deviceid: 7c404969 13 | devicename: OPPO_A33 14 | serverport: 4724 15 | bootstrapport: 4824 16 | platformname: Android 17 | platformversion: 5.1.1 18 | server: 127.0.0.1 19 | 20 | - deviceid: G6Q4U4EA99999999 21 | devicename: OPPO_A37M 22 | serverport: 4725 23 | bootstrapport: 4825 24 | platformname: Android 25 | platformversion: 5.1 26 | server: 127.0.0.1 27 | 28 | Users: 29 | - uid: 12345678 30 | username: test01 31 | mobile: 33333333333 32 | password: 333333 33 | 34 | - uid: 12345678 35 | username: test02 36 | mobile: 44444444444 37 | password: 444444 -------------------------------------------------------------------------------- /getverifycode.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 用于获取手机登陆的验证码,这里只是示例,相关地址已经隐去 3 | 4 | #手机号 5 | MOBILE=$1 6 | 7 | #token 8 | TOKEN='xxxxxxxxxxxxxxxxxxxxxx' 9 | 10 | CODE=`curl -s "http://xxxxxx?token=$TOKEN&mobile=$MOBILE" | awk -F ',' '{print $9;}' | awk -F ':' '{print $3;}' | awk -F '}' '{print $1;}'` 11 | 12 | echo $CODE 13 | 14 | -------------------------------------------------------------------------------- /log/README.md: -------------------------------------------------------------------------------- 1 | 脚本端日志 -------------------------------------------------------------------------------- /model/Device.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | #-*- coding:utf-8 -*- 3 | 4 | 5 | class Device(object): 6 | 7 | def __init__(self, deviceid): 8 | self._deviceid = deviceid 9 | self._devicename = "" 10 | self._platformversion = "" 11 | self._platformname = "" 12 | self._bootstrapport = "" 13 | self._serverport = "" 14 | self._server = "" 15 | 16 | @property 17 | def deviceid(self): 18 | return self._deviceid 19 | 20 | @deviceid.setter 21 | def deviceid(self, value): 22 | self._deviceid = value 23 | 24 | @property 25 | def devicename(self): 26 | return self._devicename 27 | 28 | @devicename.setter 29 | def devicename(self, value): 30 | self._devicename = value 31 | 32 | @property 33 | def platformversion(self): 34 | return self._platformversion 35 | 36 | @platformversion.setter 37 | def platformversion(self, value): 38 | self._platformversion = value 39 | 40 | @property 41 | def platformname(self): 42 | return self._platformname 43 | 44 | @platformname.setter 45 | def platformname(self, value): 46 | self._platformname = value 47 | 48 | @property 49 | def bootstrapport(self): 50 | return self._bootstrapport 51 | 52 | @bootstrapport.setter 53 | def bootstrapport(self, value): 54 | self._bootstrapport = value 55 | 56 | @property 57 | def serverport(self): 58 | return self._serverport 59 | 60 | @serverport.setter 61 | def serverport(self, value): 62 | self._serverport = value 63 | 64 | @property 65 | def server(self): 66 | return self._server 67 | 68 | @server.setter 69 | def server(self, value): 70 | self._server = value 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /model/User.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | 5 | class User(object): 6 | 7 | def __init__(self,uid): 8 | self._uid = uid 9 | self.username = "" 10 | self._mobile = "" 11 | self._password = "" 12 | 13 | @property 14 | def username(self): 15 | return self.username 16 | 17 | @username.setter 18 | def username(self,value): 19 | self._username = value 20 | 21 | @property 22 | def uid(self): 23 | return self._uid 24 | 25 | @uid.setter 26 | def uid(self,value): 27 | self._uid = value 28 | 29 | @property 30 | def mobile(self): 31 | return self._mobile 32 | 33 | @mobile.setter 34 | def mobile(self,value): 35 | self._mobile = value 36 | 37 | @property 38 | def password(self): 39 | return self._password 40 | 41 | @password.setter 42 | def password(self,value): 43 | self._password = value 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /model/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/model/__init__.py -------------------------------------------------------------------------------- /prepro/ASUSZ00APreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class ASUSZ00APreProcessPreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self, tester): 9 | super(ASUSZ00APreProcessPreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | 21 | #GPS权限 22 | element = self.tester.find_element_by_id('android:id/button1') 23 | if element != None: 24 | self.tester.tap_screen(155, 1065) 25 | self.action.tap(element).perform() 26 | 27 | except Exception, e: 28 | traceback.print_exc() 29 | DriverManager.quit_driver(self.tester.device.deviceid) 30 | 31 | def login_success_process(self): 32 | try: 33 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 34 | 35 | #联系人权限 36 | element = self.tester.find_element_by_id("android:id/button1") 37 | if element != None: 38 | self.tester.tap_screen(191, 1063) 39 | self.action.tap(element).perform() 40 | 41 | except Exception, e: 42 | traceback.print_exc() 43 | DriverManager.quit_driver(self.tester.device.deviceid) 44 | 45 | def get_permission_process(self): 46 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 47 | try: 48 | #打开取景框 49 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 50 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 51 | 52 | #相机权限 53 | element = self.tester.find_element_by_id("android:id/button1") 54 | if element != None: 55 | self.tester.tap_screen(129, 1010) 56 | self.action.tap(element).perform() 57 | 58 | #录音权限 59 | element = self.tester.find_element_by_id("android:id/button1") 60 | if element != None: 61 | self.tester.tap_screen(129, 1010) 62 | self.action.tap(element).perform() 63 | 64 | # 退出取景框,回到发现页面 65 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 66 | 67 | except Exception, e: 68 | traceback.print_exc() 69 | DriverManager.quit_driver(self.tester.device.deviceid) 70 | -------------------------------------------------------------------------------- /prepro/BaseDevicePreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from common.DataProvider import * 5 | from common.Log import * 6 | import threading 7 | import traceback 8 | from common.DriverManager import * 9 | from appium.webdriver.common.touch_action import TouchAction 10 | import time 11 | from appium.webdriver.webelement import WebElement 12 | from selenium.webdriver.support.ui import WebDriverWait 13 | from selenium.webdriver.support import expected_conditions as EC 14 | from selenium.webdriver.common.by import By 15 | from selenium.common.exceptions import TimeoutException 16 | from model.Tester import * 17 | import subprocess 18 | 19 | 20 | class BaseDevicePreProcess(object): 21 | 22 | def __init__(self, tester): 23 | self.tester = tester 24 | self.driver = self.tester.driver 25 | self.action = TouchAction(self.driver) 26 | self.user = self.tester.user 27 | 28 | # 开始预处理流程 29 | def pre_process(self): 30 | Log.logger.info(u"设备:%s 开始预处理流程..." % self.tester.device.devicename) 31 | driver = self.tester.driver 32 | try: 33 | if driver.is_app_installed('com.nice.main'): 34 | Log.logger.info(u"设备:%s 卸载老的nice包" % self.tester.device.devicename) 35 | driver.remove_app('com.nice.main') 36 | Log.logger.info(u"设备:%s 开始安装测试的nice包" % self.tester.device.devicename) 37 | thread = threading.Thread(target=self.install_process) 38 | thread.start() 39 | self.install_app() 40 | thread.join() 41 | Log.logger.info(u"设备:%s 启动成功" % self.tester.device.devicename) 42 | self.login_process() 43 | Log.logger.info(u"设备:%s 登录成功" % self.tester.device.devicename) 44 | self.login_success_process() 45 | time.sleep(10) 46 | self.get_permission_process() 47 | time.sleep(3) 48 | self.tester.clean_mp4_file() #预处理时清除sd的mp4文件 49 | Log.logger.info(u"设备:%s 预处理成功,开始执行测试用例" % self.tester.device.devicename) 50 | except Exception, e: 51 | Log.logger.info(u"设备:%s 出现异常!" % self.tester.device.devicename) 52 | traceback.print_exc() 53 | DriverManager.quit_driver(self.tester.device.deviceid) 54 | return False 55 | return True 56 | 57 | # 安装流程 58 | def install_app(self): 59 | self.driver.install_app(DataProvider.niceapk) 60 | 61 | # 版本升级 62 | def upgrade_app(self): 63 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid, DataProvider.nicelatestapk) 64 | subprocess.call(cmd, shell=True) 65 | 66 | time.sleep(5) 67 | self.driver.launch_app() 68 | 69 | self.tester.start_screen_record(u'直播礼物开屏') 70 | time.sleep(10) 71 | self.tester.stop_screen_record(u'直播礼物开屏') 72 | 73 | # 该流程包括处理安装及启动过程中的各种弹窗,一直到可以点击login按钮 74 | def install_process(self): 75 | pass 76 | 77 | # 该流程包括点击login按钮到达登录页面,并登录 78 | def login_process(self): 79 | Log.logger.info(u"设备:%s 开始登录,使用账号:%s" % (self.tester.device.devicename, self.tester.user.mobile)) 80 | try: 81 | # 新老注册流程的登录按钮使用的是同一个resource_id,对登录按钮不用做特殊判断 82 | 83 | #先获得注册页面的login按钮对象 84 | register_login_element = self.tester.find_element_by_id('com.nice.main:id/login') 85 | 86 | #点击登录 87 | self.action.tap(register_login_element).perform() 88 | 89 | time.sleep(2) 90 | 91 | login_phone_number_element = self.tester.find_element_by_id('com.nice.main:id/phone_number',2) 92 | while login_phone_number_element == None: 93 | self.action.tap(register_login_element).perform() 94 | time.sleep(2) 95 | login_phone_number_element = self.tester.find_element_by_id('com.nice.main:id/phone_number',2) 96 | 97 | #输入账号密码 98 | login_phone_number_element.send_keys(self.user.mobile) 99 | login_password = self.tester.find_element_by_id('com.nice.main:id/password') 100 | self.action.tap(login_password).perform() 101 | login_password.send_keys(self.user.password) 102 | 103 | #判断直到登录成功 104 | login_element = self.tester.find_element_by_id('com.nice.main:id/login') 105 | self.action.tap(login_element).perform() 106 | 107 | time.sleep(2) 108 | 109 | self.tester.screenshot(u"登录成功") 110 | except Exception,e: 111 | raise 112 | 113 | # 该流程包括登录成功后,对各种自动弹出对话框进行处理 114 | def login_success_process(self): 115 | pass 116 | 117 | # 对所有需要的权限进行处理,例如:相机、录音 118 | def get_permission_process(self): 119 | pass 120 | 121 | def check_user_profile_pic(self): 122 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnTabProfile') 123 | self.tester.find_element_by_id_and_tap('com.nice.main:id/img_profile_avatar') 124 | time.sleep(3) 125 | if self.tester.is_element_exist('编辑头像'): 126 | print '该用户未添加头像' 127 | self.tester.find_element_by_id_and_tap('com.nice.main:id/img_publish_photo') 128 | time.sleep(3) 129 | if self.tester.is_element_exist('com.nice.main:id/image'): 130 | self.tester.find_element_by_uiautomator_and_tap('new UiSelector().resourceId(\"com.nice.main:id/image\").index(0)') 131 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_action_btn') 132 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_action_btn') 133 | time.sleep(5) # 上传头像到【我】页面 134 | else: 135 | Log.logger.info(u'上传头像失败') 136 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 137 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 138 | else: 139 | print '该用户已添加头像' 140 | self.tester.find_element_by_id_and_tap('com.nice.main:id/profile_black') 141 | 142 | # 创建autotest文件夹并生成测试图片 143 | def data_prepare(self): 144 | Log.logger.info(u"设备:%s 检查文件开始" % self.tester.device.devicename) 145 | if self.tester.is_autotest_exit(): 146 | time.sleep(1) 147 | else: 148 | Log.logger.info(u"设备:%s 写入测试文件" % self.tester.device.devicename) 149 | self.tester.pull_file_to_device() 150 | time.sleep(10) 151 | self.tester.refresh_test_pic() 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | -------------------------------------------------------------------------------- /prepro/ChuiZi_YQ607PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | import subprocess 6 | from common.DataProvider import * 7 | 8 | class ChuiZi_YQ607PreProcess (BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(ChuiZi_YQ607PreProcess, self).__init__(tester) 12 | 13 | def install_app(self): 14 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 15 | subprocess.call(cmd,shell=True) 16 | 17 | 18 | def install_process(self): 19 | try: 20 | Log.logger.info(u"设备:%s 安装app并处理GPS弹窗" % self.tester.device.devicename) 21 | 22 | #启动app 23 | while self.driver.is_app_installed("com.nice.main") == False: 24 | time.sleep(2) 25 | self.driver.launch_app() 26 | 27 | #获取位置信息 28 | time.sleep(5) 29 | self.tester.find_element_by_id_and_tap('android:id/button1') 30 | 31 | except Exception, e: 32 | traceback.print_exc() 33 | DriverManager.quit_driver(self.tester.device.deviceid) 34 | # 该流程包括点击login按钮到达登录页面,并登录 35 | 36 | def login_process(self): 37 | Log.logger.info(u"设备:%s 开始登录,使用账号:%s" % (self.tester.device.devicename, self.tester.user.mobile)) 38 | try: 39 | # 新老注册流程的登录按钮使用的是同一个resource_id,对登录按钮不用做特殊判断 40 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 41 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number', self.user.mobile) 42 | self.tester.find_element_by_id_and_tap('com.nice.main:id/password') 43 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password', self.user.password) 44 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 45 | 46 | time.sleep(1) 47 | self.tester.screenshot(u"登录成功") 48 | except Exception, e: 49 | raise 50 | def login_success_process(self): 51 | try: 52 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 53 | 54 | element = self.tester.find_element_by_id("android:id/button1") 55 | if element != None: 56 | self.action.tap(element).perform() 57 | 58 | except Exception, e: 59 | traceback.print_exc() 60 | DriverManager.quit_driver(self.tester.device.deviceid) 61 | 62 | def get_permission_process(self): 63 | try: 64 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 65 | 66 | #打开取景窗 67 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 68 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 69 | 70 | time.sleep(3) 71 | # 权限 72 | self.tester.find_element_by_id_and_tap('android:id/button1') 73 | 74 | # 权限 75 | self.tester.find_element_by_id_and_tap('android:id/button1') 76 | 77 | #关闭取景框 78 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 79 | 80 | except Exception, e: 81 | traceback.print_exc() 82 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/Coopad8729PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class Coopad8729PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(Coopad8729PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | 21 | #处理获取地理位置弹框 22 | element = self.tester.find_element_by_id("com.yulong.android.seccenter:id/alertdlg_allowed",20) 23 | if element != None: 24 | self.action.tap(element).perform() 25 | 26 | except Exception, e: 27 | Log.logger.info(u"设备:%s 没有找到GPS弹窗" % self.tester.device.devicename) 28 | 29 | def login_success_process(self): 30 | try: 31 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 32 | 33 | #获取联系人权限 34 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 35 | 36 | except Exception, e: 37 | Log.logger.info(u"设备:%s 没有找到联系人弹窗" % self.tester.device.devicename) 38 | 39 | def get_permission_process(self): 40 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 41 | try: 42 | 43 | #打开取景框 44 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 45 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 46 | #摄像头权限 47 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 48 | 49 | #录音权限 50 | self.tester.find_element_by_id_and_tap('com.nice.main:id/gallery_tv') 51 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 52 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 53 | 54 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 55 | 56 | except Exception, e: 57 | traceback.print_exc() 58 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/Coopad8729blackPreprocess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class Coopad8729blackPreprocess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(Coopad8729blackPreprocess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | 21 | #处理获取地理位置弹框 22 | element = self.tester.find_element_by_id("com.yulong.android.seccenter:id/alertdlg_allowed",20) 23 | if element != None: 24 | self.action.tap(element).perform() 25 | 26 | except Exception, e: 27 | traceback.print_exc() 28 | DriverManager.quit_driver(self.tester.device.deviceid) 29 | 30 | def login_success_process(self): 31 | try: 32 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 33 | 34 | #获取联系人权限 35 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 36 | 37 | except Exception, e: 38 | traceback.print_exc() 39 | DriverManager.quit_driver(self.tester.device.deviceid) 40 | 41 | def get_permission_process(self): 42 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 43 | try: 44 | #打开取景框 45 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 46 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 47 | #摄像头权限 48 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 49 | 50 | #录音权限 51 | self.tester.find_element_by_id_and_tap('com.nice.main:id/gallery_tv') 52 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 53 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 54 | 55 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 56 | 57 | except Exception, e: 58 | traceback.print_exc() 59 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/Coopad8765PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class Coopad8765PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(Coopad8765PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | 21 | #处理获取地理位置弹框 22 | element = self.tester.find_element_by_id("com.yulong.android.security:id/button3",20) 23 | if element != None: 24 | self.action.tap(element).perform() 25 | 26 | except Exception, e: 27 | traceback.print_exc() 28 | DriverManager.quit_driver(self.tester.device.deviceid) 29 | 30 | def login_success_process(self): 31 | try: 32 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 33 | 34 | #获取联系人权限 35 | element = self.tester.find_element_by_id("com.yulong.android.security:id/button3",20) 36 | if element != None: 37 | self.action.tap(element).perform() 38 | 39 | except Exception, e: 40 | traceback.print_exc() 41 | DriverManager.quit_driver(self.tester.device.deviceid) 42 | 43 | def get_permission_process(self): 44 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 45 | try: 46 | #打开取景框 47 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 48 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 49 | #摄像头权限 50 | self.tester.find_element_by_id_and_tap('com.yulong.android.security:id/button3') 51 | 52 | #录音权限 53 | self.tester.find_element_by_id_and_tap('com.nice.main:id/gallery_tv') 54 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 55 | self.tester.find_element_by_id_and_tap('com.yulong.android.security:id/button3') 56 | 57 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 58 | 59 | except Exception, e: 60 | traceback.print_exc() 61 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/Coopad9729blackPreprocess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class Coopad9729blackPreprocess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(Coopad9729blackPreprocess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | 21 | #处理获取地理位置弹框 22 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 23 | 24 | except Exception, e: 25 | traceback.print_exc() 26 | DriverManager.quit_driver(self.tester.device.deviceid) 27 | 28 | def login_success_process(self): 29 | try: 30 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 31 | 32 | #获取联系人权限 33 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 34 | 35 | except Exception, e: 36 | traceback.print_exc() 37 | DriverManager.quit_driver(self.tester.device.deviceid) 38 | 39 | def get_permission_process(self): 40 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 41 | try: 42 | #打开取景框 43 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 44 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 45 | 46 | #视频权限 47 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 48 | #录音权限 49 | self.tester.find_element_by_id_and_tap('com.yulong.android.seccenter:id/alertdlg_allowed') 50 | 51 | self.tester.press_keycode(4) 52 | 53 | except Exception, e: 54 | traceback.print_exc() 55 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/HTCBFPreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class HTCBFPreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(HTCBFPreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | except Exception, e: 21 | traceback.print_exc() 22 | DriverManager.quit_driver(self.tester.device.deviceid) 23 | 24 | def login_process(self): 25 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 26 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number', self.user.mobile) 27 | 28 | self.tester.find_element_by_id_and_tap('com.nice.main:id/password') 29 | 30 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password', self.user.password) 31 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 32 | 33 | def login_success_process(self): 34 | try: 35 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 36 | 37 | except Exception, e: 38 | traceback.print_exc() 39 | DriverManager.quit_driver(self.tester.device.deviceid) 40 | 41 | def get_permission_process(self): 42 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 43 | try: 44 | #打开取景框 45 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 46 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 47 | 48 | # 退出取景框,回到发现页面 49 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 50 | except Exception, e: 51 | traceback.print_exc() 52 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/HTCD826wPreProcess.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | from BaseDevicePreProcess import * 3 | 4 | class HTCD826wPreProcess (BaseDevicePreProcess): 5 | 6 | def __init__(self, tester): 7 | super(HTCD826wPreProcess, self).__init__(tester) 8 | 9 | def install_process(self): 10 | try: 11 | Log.logger.info(u"设备:%s 启动app并处理安装" % self.tester.device.devicename) 12 | 13 | while self.tester.is_element_exist('com.htc:id/primary')==False: 14 | time.sleep(1) 15 | 16 | time.sleep(2) 17 | self.tester.press_keycode(4) 18 | 19 | while self.driver.is_app_installed("com.nice.main") == False: 20 | time.sleep(2) 21 | 22 | self.driver.launch_app() 23 | except Exception, e: 24 | traceback.print_exc() 25 | DriverManager.quit_driver(self.tester.device.deviceid) 26 | 27 | def login_process(self): 28 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 29 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number', self.user.mobile) 30 | self.tester.find_element_by_id_and_tap('com.nice.main:id/password') 31 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password', self.user.password) 32 | self.tester.press_keycode(4) 33 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 34 | 35 | def login_success_process(self): 36 | Log.logger.info(u"设备:%s 登录成功后,无需处理" % self.tester.device.devicename) 37 | 38 | def get_permission_process(self): 39 | Log.logger.info(u"设备:%s 无需处理" % self.tester.device.devicename) 40 | 41 | 42 | -------------------------------------------------------------------------------- /prepro/HTCONEPreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class HTCONEPreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(HTCONEPreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | except Exception, e: 21 | traceback.print_exc() 22 | DriverManager.quit_driver(self.tester.device.deviceid) 23 | 24 | def login_process(self): 25 | 26 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 27 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number', self.user.mobile) 28 | 29 | self.tester.find_element_by_id_and_tap('com.nice.main:id/password') 30 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password', self.user.password) 31 | self.tester.press_keycode(4) 32 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 33 | 34 | def login_success_process(self): 35 | try: 36 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 37 | 38 | 39 | except Exception, e: 40 | traceback.print_exc() 41 | DriverManager.quit_driver(self.tester.device.deviceid) 42 | 43 | def get_permission_process(self): 44 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 45 | try: 46 | #打开取景框 47 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 48 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 49 | 50 | # 退出取景框,回到发现页面 51 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 52 | except Exception, e: 53 | traceback.print_exc() 54 | DriverManager.quit_driver(self.tester.device.deviceid) 55 | -------------------------------------------------------------------------------- /prepro/HUAWEIMT7PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | from prepro.HuaWeiG9PreProcess import * 6 | 7 | class HUAWEIMT7PreProcess (HuaWeiG9PreProcess): 8 | 9 | def __init__(self, tester): 10 | super(HUAWEIMT7PreProcess, self).__init__(tester) 11 | -------------------------------------------------------------------------------- /prepro/HUAWEIVNSAL00PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | 7 | class HUAWEIVNSAL00PreProcess (BaseDevicePreProcess): 8 | 9 | def __init__(self, tester): 10 | super(HUAWEIVNSAL00PreProcess, self).__init__(tester) 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 处理安装提示" % self.tester.device.devicename) 15 | 16 | # self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/decide_to_continue') 17 | # self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/goinstall') 18 | 19 | while self.driver.is_app_installed("com.nice.main") == False: 20 | time.sleep(2) 21 | 22 | self.driver.launch_app() 23 | 24 | # 已安装应用列表权限 25 | self.tester.find_element_by_id_and_tap('com.huawei.systemmanager:id/btn_allow') 26 | 27 | except Exception, e: 28 | traceback.print_exc() 29 | DriverManager.quit_driver(self.tester.device.deviceid) 30 | 31 | def login_success_process(self): 32 | try: 33 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 34 | 35 | # 权限申请 36 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 37 | time.sleep(1) 38 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 39 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') 40 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 41 | 42 | Log.logger.info(u"设备:%s 没有成功授权通讯录" % self.tester.device.devicename) 43 | 44 | except Exception, e: 45 | traceback.print_exc() 46 | DriverManager.quit_driver(self.tester.device.deviceid) 47 | 48 | def get_permission_process(self): 49 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 50 | try: 51 | #打开取景框 52 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 53 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 54 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 55 | if self.tester.is_element_exist('com.huawei.systemmanager:id/btn_allow'): 56 | self.tester.tap_screen(730, 1170) 57 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 58 | time.sleep(1) 59 | 60 | except Exception, e: 61 | traceback.print_exc() 62 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/HUIWEIP6PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class HUAWEIP6PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(HUAWEIP6PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | 21 | #获取定位权限 22 | self.tester.find_element_by_id_and_tap('com.huawei.systemmanager:id/btn_allow') 23 | 24 | except Exception, e: 25 | traceback.print_exc() 26 | DriverManager.quit_driver(self.tester.device.deviceid) 27 | 28 | def login_success_process(self): 29 | try: 30 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 31 | 32 | #授权通讯录 33 | self.tester.find_element_by_id_and_tap('com.huawei.systemmanager:id/btn_allow') 34 | 35 | except Exception, e: 36 | traceback.print_exc() 37 | DriverManager.quit_driver(self.tester.device.deviceid) 38 | 39 | def get_permission_process(self): 40 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 41 | try: 42 | #打开取景框 43 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 44 | 45 | #切换到拍摄tab 46 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 47 | 48 | self.tester.press_keycode(4) 49 | 50 | time.sleep(1) 51 | 52 | except Exception, e: 53 | traceback.print_exc() 54 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/HuaWeiG9PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | from model import Tester 6 | 7 | class HuaWeiG9PreProcess (BaseDevicePreProcess): 8 | 9 | def __init__(self,tester): 10 | super(HuaWeiG9PreProcess, self).__init__(tester) 11 | 12 | def install_app(self): 13 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid, DataProvider.niceapk) 14 | subprocess.call(cmd, shell=True) 15 | 16 | # 开始预处理流程 17 | def pre_process(self): 18 | Log.logger.info(u"设备:%s 开始预处理流程..." % self.tester.device.devicename) 19 | driver = self.tester.driver 20 | try: 21 | if driver.is_app_installed('com.nice.main'): 22 | Log.logger.info(u"设备:%s 卸载老的nice包" % self.tester.device.devicename) 23 | driver.remove_app('com.nice.main') 24 | 25 | if self.tester.is_element_exist('android:id/button1',30): 26 | self.tester.find_element_by_id_and_tap('android:id/button1') 27 | 28 | Log.logger.info(u"设备:%s 开始安装测试的nice包" % self.tester.device.devicename) 29 | thread = threading.Thread(target=self.install_process) 30 | thread.start() 31 | self.install_app() 32 | thread.join() 33 | Log.logger.info(u"设备:%s 启动成功" % self.tester.device.devicename) 34 | self.login_process() 35 | Log.logger.info(u"设备:%s 登录成功" % self.tester.device.devicename) 36 | self.login_success_process() 37 | self.get_permission_process() 38 | time.sleep(3) 39 | self.tester.clean_mp4_file() # 预处理时清除sd的mp4文件 40 | Log.logger.info(u"设备:%s 预处理成功,开始执行测试用例" % self.tester.device.devicename) 41 | except Exception, e: 42 | traceback.print_exc() 43 | DriverManager.quit_driver(self.tester.device.deviceid) 44 | return False 45 | return True 46 | 47 | def install_process(self): 48 | try: 49 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 50 | 51 | if self.tester.is_element_exist('com.android.packageinstaller:id/decide_to_continue',10) == True: 52 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/decide_to_continue') 53 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/goinstall') 54 | elif self.tester.is_element_exist('com.android.packageinstaller:id/ok_button',10) == True: 55 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/ok_button') 56 | else : 57 | print 'error!' 58 | except Exception, e: 59 | traceback.print_exc() 60 | DriverManager.quit_driver(self.tester.device.deviceid) 61 | # 该流程包括点击login按钮到达登录页面,并登录 62 | finally: 63 | while self.driver.is_app_installed("com.nice.main") == False: 64 | time.sleep(2) 65 | 66 | self.driver.launch_app() 67 | 68 | # 获取定位权限 69 | self.tester.find_element_by_id_and_tap('com.huawei.systemmanager:id/btn_allow') 70 | 71 | def login_process(self): 72 | Log.logger.info(u"设备:%s 开始登录,使用账号:%s" % (self.tester.device.devicename, self.tester.user.mobile)) 73 | try: 74 | # 新老注册流程的登录按钮使用的是同一个resource_id,对登录按钮不用做特殊判断 75 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 76 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number', self.user.mobile) 77 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password', self.user.password) 78 | 79 | self.tester.press_keycode(4) 80 | 81 | time.sleep(1) 82 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 83 | 84 | time.sleep(1) 85 | self.tester.screenshot(u"登录成功") 86 | except Exception, e: 87 | raise 88 | 89 | def login_success_process(self): 90 | try: 91 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 92 | 93 | #授权sd卡 94 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/do_not_ask_checkbox') 95 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 96 | 97 | #授权位置信息 98 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/do_not_ask_checkbox') 99 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 100 | 101 | #授权通讯录 102 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') 103 | 104 | time.sleep(5) 105 | if self.tester.is_element_exist('com.android.packageinstaller:id/permission_allow_button'): 106 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/do_not_ask_checkbox') 107 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 108 | 109 | time.sleep(5) 110 | if self.tester.is_element_exist('com.nice.main:id/btn_know'): 111 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_know') 112 | 113 | except Exception, e: 114 | traceback.print_exc() 115 | DriverManager.quit_driver(self.tester.device.deviceid) 116 | 117 | def get_permission_process(self): 118 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 119 | try: 120 | #打开取景框 121 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 122 | 123 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/do_not_ask_checkbox') 124 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 125 | 126 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/do_not_ask_checkbox') 127 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 128 | 129 | 130 | # 切换到拍摄tab 131 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 132 | 133 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 134 | time.sleep(1) 135 | 136 | except Exception, e: 137 | traceback.print_exc() 138 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/HuaWeiJAZZProPrecess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | from model import Tester 6 | from prepro.HuaWeiG9PreProcess import * 7 | from prepro.HUAWEIMT7PreProcess import * 8 | 9 | class HuaWeiJAZZProPrecess(HuaWeiG9PreProcess): 10 | 11 | def __init__(self,tester): 12 | super(HuaWeiJAZZProPrecess, self).__init__(tester) 13 | -------------------------------------------------------------------------------- /prepro/LeX620PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class LeX620PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(LeX620PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | except Exception, e: 21 | traceback.print_exc() 22 | DriverManager.quit_driver(self.tester.device.deviceid) 23 | 24 | def login_success_process(self): 25 | try: 26 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 27 | 28 | #权限管理弹框 29 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 30 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 31 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 32 | 33 | #授权通讯录弹框 34 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') 35 | 36 | #通讯录权限申请弹框 37 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 38 | 39 | time.sleep(3) 40 | element = self.tester.find_element_by_id("com.nice.main:id/btn_know") 41 | if element != None: 42 | self.action.tap(element).perform() 43 | 44 | except Exception, e: 45 | traceback.print_exc() 46 | DriverManager.quit_driver(self.tester.device.deviceid) 47 | 48 | def get_permission_process(self): 49 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 50 | try: 51 | #打开取景框 52 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 53 | 54 | # 摄像头权限 55 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 56 | 57 | # 录音权限 58 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 59 | 60 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 61 | 62 | 63 | # 退出取景框,回到发现页面 64 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 65 | except Exception, e: 66 | traceback.print_exc() 67 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/LianXiang5860PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | import subprocess 6 | from common.DataProvider import * 7 | 8 | class LianXiang5860PreProcess (BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(LianXiang5860PreProcess, self).__init__(tester) 12 | 13 | #魅族情况太特殊,安装都得继承然后单独处理,弹出的adb安装权限直接阻塞了Server运行 14 | def install_app(self): 15 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 16 | subprocess.call(cmd,shell=True) 17 | 18 | 19 | def install_process(self): 20 | try: 21 | Log.logger.info(u"设备:%s 安装app并处理GPS弹窗" % self.tester.device.devicename) 22 | 23 | #启动app 24 | while self.driver.is_app_installed("com.nice.main") == False: 25 | time.sleep(2) 26 | self.driver.launch_app() 27 | 28 | #GPS权限 29 | self.tester.find_element_by_id_and_tap('com.mediatek.security:id/checkbox') 30 | self.tester.find_element_by_id_and_tap('android:id/button1') 31 | 32 | except Exception, e: 33 | traceback.print_exc() 34 | DriverManager.quit_driver(self.tester.device.deviceid) 35 | # 该流程包括点击login按钮到达登录页面,并登录 36 | 37 | def login_process(self): 38 | Log.logger.info(u"设备:%s 开始登录,使用账号:%s" % (self.tester.device.devicename, self.tester.user.mobile)) 39 | try: 40 | # 新老注册流程的登录按钮使用的是同一个resource_id,对登录按钮不用做特殊判断 41 | 42 | # 先获得注册页面的login按钮对象 43 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 44 | time.sleep(5) 45 | 46 | while self.tester.is_element_exist(u'已有账号登录'): 47 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 48 | time.sleep(2) 49 | 50 | #输入账号 51 | self.tester.find_element_by_id_and_tap('com.nice.main:id/phone_number') 52 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number',self.user.mobile) 53 | 54 | # 输入密码 55 | self.tester.find_element_by_id_and_tap('com.nice.main:id/password') 56 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password',self.user.password) 57 | 58 | #登录 59 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 60 | 61 | # 判断直到登录成功 62 | time.sleep(5) 63 | self.tester.screenshot(u"登录成功") 64 | 65 | except Exception, e: 66 | raise 67 | 68 | def login_success_process(self): 69 | try: 70 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 71 | 72 | self.tester.find_element_by_id_and_tap('com.mediatek.security:id/checkbox') 73 | self.tester.find_element_by_id_and_tap('android:id/button1') 74 | 75 | except Exception, e: 76 | traceback.print_exc() 77 | DriverManager.quit_driver(self.tester.device.deviceid) 78 | 79 | def get_permission_process(self): 80 | try: 81 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 82 | 83 | #打开取景窗 84 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 85 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 86 | 87 | #摄像头权限 88 | self.tester.find_element_by_id_and_tap('com.mediatek.security:id/checkbox') 89 | self.tester.find_element_by_id_and_tap('android:id/button1') 90 | 91 | #录音权限 92 | self.tester.find_element_by_id_and_tap('com.mediatek.security:id/checkbox') 93 | self.tester.find_element_by_id_and_tap('android:id/button1') 94 | 95 | #关闭取景框 96 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 97 | 98 | except Exception, e: 99 | traceback.print_exc() 100 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/LianXiangK30TPreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | from appium.webdriver.webelement import WebElement 6 | import subprocess 7 | 8 | class LianXiangK30TPreProcess(BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(LianXiangK30TPreProcess, self).__init__(tester) 12 | 13 | # def install_app(self): 14 | # Log.logger.info(u"设备:%s 安装时弹出获取权限弹框" % self.tester.device.devicename) 15 | # try: 16 | # 17 | # except: 18 | # traceback.print_exc() 19 | 20 | def install_process(self): 21 | try: 22 | Log.logger.info(u"设备:%s 处理安装中各种弹窗" % self.tester.device.devicename) 23 | 24 | self.tester.find_element_by_uiautomator_and_tap( 25 | 'new UiSelector().resourceId(\"com.lenovo.safecenter:id/btn_install\").textContains(\"确定\")') 26 | 27 | # 启动app 28 | while self.driver.is_app_installed("com.nice.main") == False: 29 | time.sleep(2) 30 | self.driver.launch_app() 31 | 32 | except Exception, e: 33 | traceback.print_exc() 34 | DriverManager.quit_driver(self.tester.device.deviceid) 35 | 36 | def login_success_process(self): 37 | try: 38 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 39 | 40 | except Exception, e: 41 | traceback.print_exc() 42 | DriverManager.quit_driver(self.tester.device.deviceid) 43 | 44 | def get_permission_process(self): 45 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 46 | try: 47 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 48 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 49 | 50 | #关闭取景框 51 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 52 | 53 | except Exception, e: 54 | traceback.print_exc() 55 | DriverManager.quit_driver(self.tester.device.deviceid) 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /prepro/M3notePreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | import subprocess 6 | from common.DataProvider import * 7 | 8 | class M3notePreProcess (BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(M3notePreProcess, self).__init__(tester) 12 | 13 | #魅族情况太特殊,安装都得继承然后单独处理,弹出的adb安装权限直接阻塞了Server运行 14 | def install_app(self): 15 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 16 | subprocess.call(cmd,shell=True) 17 | 18 | 19 | def install_process(self): 20 | 21 | Log.logger.info(u"设备:%s 安装app并处理GPS弹窗" % self.tester.device.devicename) 22 | try: 23 | #adb 24 | element = self.tester.find_element_by_id("android:id/button1",20) 25 | if element != None: 26 | self.action.tap(element).perform() 27 | 28 | # 启动app 29 | while self.driver.is_app_installed("com.nice.main") == False: 30 | time.sleep(2) 31 | self.driver.launch_app() 32 | 33 | # nice获取手机GPS权限 34 | element = self.tester.find_element_by_id("android:id/button1",20) 35 | if element != None: 36 | self.action.tap(element).perform() 37 | 38 | # nice获取手机识别码权限 39 | element = self.tester.find_element_by_id("android:id/button1",10) 40 | if element != None: 41 | self.action.tap(element).perform() 42 | 43 | except Exception, e: 44 | traceback.print_exc() 45 | DriverManager.quit_driver(self.tester.device.deviceid) 46 | 47 | def login_process(self): 48 | Log.logger.info(u"设备:%s 开始登录,使用账号:%s" % (self.tester.device.devicename, self.tester.user.mobile)) 49 | try: 50 | # 新老注册流程的登录按钮使用的是同一个resource_id,对登录按钮不用做特殊判断 51 | 52 | #先获得注册页面的login按钮对象 53 | register_login_element = self.tester.find_element_by_id('com.nice.main:id/login') 54 | 55 | #点击登录 56 | self.action.tap(register_login_element).perform() 57 | 58 | time.sleep(2) 59 | 60 | login_phone_number_element = self.tester.find_element_by_id('com.nice.main:id/phone_number',2) 61 | while login_phone_number_element == None: 62 | self.action.tap(register_login_element).perform() 63 | time.sleep(2) 64 | login_phone_number_element = self.tester.find_element_by_id('com.nice.main:id/phone_number',2) 65 | 66 | #输入账号密码 67 | login_phone_number_element.send_keys(self.user.mobile) 68 | login_password = self.tester.find_element_by_id('com.nice.main:id/password') 69 | self.action.tap(login_password).perform() 70 | login_password.send_keys(self.user.password) 71 | 72 | #判断直到登录成功 73 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 74 | time.sleep(5) 75 | self.tester.screenshot(u"登录成功") 76 | except Exception,e: 77 | raise 78 | 79 | def login_success_process(self): 80 | try: 81 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 82 | 83 | #联系人权限 84 | self.tester.find_element_by_id_and_tap('android:id/button1') 85 | 86 | except Exception, e: 87 | traceback.print_exc() 88 | DriverManager.quit_driver(self.tester.device.deviceid) 89 | 90 | def get_permission_process(self): 91 | try: 92 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 93 | 94 | #打开取景窗 95 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 96 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 97 | 98 | #通讯录权限 99 | self.tester.find_element_by_id_and_tap('android:id/button1') 100 | # 录音权限 101 | time.sleep(2) 102 | self.tester.find_element_by_id_and_tap('android:id/button1') 103 | 104 | #关闭取景框 105 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 106 | 107 | except Exception, e: 108 | traceback.print_exc() 109 | DriverManager.quit_driver(self.tester.device.deviceid) 110 | -------------------------------------------------------------------------------- /prepro/M57APreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | import subprocess 6 | from common.DataProvider import * 7 | 8 | class M57APreProcess (BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(M57APreProcess, self).__init__(tester) 12 | 13 | #魅族情况太特殊,安装都得继承然后单独处理,弹出的adb安装权限直接阻塞了Server运行 14 | def install_app(self): 15 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 16 | subprocess.call(cmd,shell=True) 17 | 18 | 19 | def install_process(self): 20 | try: 21 | Log.logger.info(u"设备:%s 安装app并处理GPS弹窗" % self.tester.device.devicename) 22 | 23 | #adb安装权限 24 | self.tester.find_element_by_id_and_tap('android:id/button1') 25 | 26 | #启动app 27 | while self.driver.is_app_installed("com.nice.main") == False: 28 | time.sleep(2) 29 | self.driver.launch_app() 30 | 31 | #GPS权限 32 | #self.tester.find_element_by_id_and_tap('android:id/button1') 33 | 34 | except Exception, e: 35 | traceback.print_exc() 36 | DriverManager.quit_driver(self.tester.device.deviceid) 37 | 38 | def login_success_process(self): 39 | try: 40 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 41 | 42 | #联系人权限 43 | #self.tester.find_element_by_id_and_tap('android:id/button1') 44 | 45 | except Exception, e: 46 | traceback.print_exc() 47 | DriverManager.quit_driver(self.tester.device.deviceid) 48 | 49 | def get_permission_process(self): 50 | try: 51 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 52 | 53 | #打开取景窗 54 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 55 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 56 | 57 | #录音权限 58 | #self.tester.find_element_by_id_and_tap('android:id/button1') 59 | 60 | #关闭取景框 61 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 62 | 63 | except Exception, e: 64 | traceback.print_exc() 65 | DriverManager.quit_driver(self.tester.device.deviceid) 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /prepro/MEITU5PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class MEITU5PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(MEITU5PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | except Exception, e: 21 | traceback.print_exc() 22 | DriverManager.quit_driver(self.tester.device.deviceid) 23 | 24 | def login_success_process(self): 25 | try: 26 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 27 | 28 | #权限管理弹框 29 | # self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 30 | # self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 31 | # self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 32 | 33 | #授权通讯录弹框 34 | #self.tester.find_element_by_id_and_tap('com.nice.main:id/txt_time') 35 | 36 | #通讯录权限申请弹框 37 | self.tester.find_element_by_id_and_tap('com.mediatek.security:id/mts_button1') 38 | except Exception, e: 39 | traceback.print_exc() 40 | DriverManager.quit_driver(self.tester.device.deviceid) 41 | 42 | def get_permission_process(self): 43 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 44 | try: 45 | #打开取景框 46 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 47 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 48 | 49 | # 摄像头权限 50 | self.tester.find_element_by_id_and_tap('com.mediatek.security:id/mts_button1') 51 | 52 | # 退出取景框,回到发现页面 53 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 54 | except Exception, e: 55 | traceback.print_exc() 56 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/MEITUM4PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class MEITUM4PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(MEITUM4PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | 21 | time.sleep(7) 22 | 23 | # 获取允许弹框的坐标并点击 24 | print '干掉允许按钮,程序往下继续执行' 25 | self.driver.swipe(488, 710, 488, 710, 5) 26 | 27 | except Exception, e: 28 | Log.logger.info(u"设备:%s 发生错误" % self.tester.device.devicename) 29 | traceback.print_exc() 30 | DriverManager.quit_driver(self.tester.device.deviceid) 31 | 32 | def login_success_process(self): 33 | try: 34 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 35 | 36 | time.sleep(4) 37 | print '允许授权通讯录权限' 38 | self.driver.swipe(493,705,493,705,5) 39 | 40 | except Exception, e: 41 | Log.logger.info(u"设备:%s 发生错误" % self.tester.device.devicename) 42 | traceback.print_exc() 43 | DriverManager.quit_driver(self.tester.device.deviceid) 44 | 45 | def get_permission_process(self): 46 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 47 | try: 48 | #打开取景框 49 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 50 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 51 | 52 | #摄像头权限 53 | time.sleep(2) 54 | print '授权摄像头权限' 55 | self.driver.swipe(500,721,500,721,5) 56 | 57 | # 录音权限 58 | time.sleep(6) 59 | print '授权录音权限' 60 | self.driver.swipe(490,722,490,722,5) 61 | 62 | time.sleep(1) 63 | # 退出取景框,回到发现页面 64 | if self.tester.is_element_exist('com.nice.main:id/titlebar_return',3): 65 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 66 | else: 67 | self.tester.back_to_feed() 68 | except Exception, e: 69 | Log.logger.info(u"设备:%s 发生错误" % self.tester.device.devicename) 70 | traceback.print_exc() 71 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/MEIZU4PROPreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | import subprocess 6 | from common.DataProvider import * 7 | 8 | class MEIZU4PROPreProcess (BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(MEIZU4PROPreProcess, self).__init__(tester) 12 | 13 | #魅族情况太特殊,安装都得继承然后单独处理,弹出的adb安装权限直接阻塞了Server运行 14 | def install_app(self): 15 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 16 | subprocess.call(cmd,shell=True) 17 | 18 | 19 | def install_process(self): 20 | try: 21 | Log.logger.info(u"设备:%s 安装app并处理GPS弹窗" % self.tester.device.devicename) 22 | 23 | #adb 24 | element = self.tester.find_element_by_id("android:id/button1",20) 25 | if element != None: 26 | self.action.tap(element).perform() 27 | 28 | #启动app 29 | while self.driver.is_app_installed("com.nice.main") == False: 30 | time.sleep(2) 31 | self.driver.launch_app() 32 | 33 | #GPS权限 34 | self.tester.find_element_by_id_and_tap('android:id/button1') 35 | 36 | except Exception, e: 37 | traceback.print_exc() 38 | DriverManager.quit_driver(self.tester.device.deviceid) 39 | 40 | 41 | def login_success_process(self): 42 | try: 43 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 44 | 45 | #联系人权限 46 | self.tester.find_element_by_id_and_tap('android:id/button1') 47 | 48 | except Exception, e: 49 | traceback.print_exc() 50 | DriverManager.quit_driver(self.tester.device.deviceid) 51 | 52 | def get_permission_process(self): 53 | try: 54 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 55 | 56 | #打开取景窗 57 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 58 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 59 | 60 | #摄像头权限 61 | self.tester.find_element_by_id_and_tap('android:id/button1') 62 | 63 | element = self.tester.find_element_by_id("android:id/button1") 64 | if element != None: 65 | self.action.tap(element).perform() 66 | 67 | #关闭取景框 68 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 69 | 70 | except Exception, e: 71 | traceback.print_exc() 72 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/MX5PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | import subprocess 6 | from common.DataProvider import * 7 | 8 | class MX5PreProcess (BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(MX5PreProcess, self).__init__(tester) 12 | 13 | #魅族情况太特殊,安装都得继承然后单独处理,弹出的adb安装权限直接阻塞了Server运行 14 | def install_app(self): 15 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 16 | subprocess.call(cmd,shell=True) 17 | 18 | def install_process(self): 19 | try: 20 | Log.logger.info(u"设备:%s 安装app并处理GPS弹窗" % self.tester.device.devicename) 21 | 22 | #adb 23 | element = self.tester.find_element_by_id("android:id/button1",20) 24 | if element != None: 25 | self.action.tap(element).perform() 26 | 27 | #启动app 28 | while self.driver.is_app_installed("com.nice.main") == False: 29 | time.sleep(2) 30 | self.driver.launch_app() 31 | 32 | #GPS权限 33 | self.tester.find_element_by_id_and_tap('android:id/button1') 34 | 35 | except Exception, e: 36 | traceback.print_exc() 37 | DriverManager.quit_driver(self.tester.device.deviceid) 38 | 39 | def login_success_process(self): 40 | try: 41 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 42 | 43 | #联系人权限 44 | self.tester.find_element_by_id_and_tap('android:id/button1') 45 | 46 | except Exception, e: 47 | traceback.print_exc() 48 | DriverManager.quit_driver(self.tester.device.deviceid) 49 | 50 | def get_permission_process(self): 51 | try: 52 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 53 | 54 | #打开取景窗 55 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 56 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 57 | 58 | #摄像头权限 59 | self.tester.find_element_by_id_and_tap('android:id/button1') 60 | 61 | element = self.tester.find_element_by_id("android:id/button1") 62 | if element != None: 63 | self.action.tap(element).perform() 64 | 65 | #关闭取景框 66 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 67 | 68 | except Exception, e: 69 | traceback.print_exc() 70 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/MZM1notePreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | import subprocess 6 | from common.DataProvider import * 7 | 8 | class MZM1notePreProcess (BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(MZM1notePreProcess, self).__init__(tester) 12 | 13 | #魅族情况太特殊,安装都得继承然后单独处理,弹出的adb安装权限直接阻塞了Server运行 14 | def install_app(self): 15 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 16 | subprocess.call(cmd,shell=True) 17 | 18 | 19 | def install_process(self): 20 | try: 21 | Log.logger.info(u"设备:%s 安装app并处理GPS弹窗" % self.tester.device.devicename) 22 | 23 | #adb 24 | element = self.tester.find_element_by_id("android:id/button1",20) 25 | if element != None: 26 | self.action.tap(element).perform() 27 | 28 | #启动app 29 | while self.driver.is_app_installed("com.nice.main") == False: 30 | time.sleep(2) 31 | self.driver.launch_app() 32 | 33 | # nice获取手机GPS权限 34 | self.tester.find_element_by_id_and_tap('android:id/button1') 35 | 36 | # nice获取手机识别码权限 37 | time.sleep(2) 38 | element = self.tester.find_element_by_id("android:id/button1") 39 | if element != None: 40 | self.action.tap(element).perform() 41 | 42 | except Exception, e: 43 | traceback.print_exc() 44 | DriverManager.quit_driver(self.tester.device.deviceid) 45 | 46 | def login_success_process(self): 47 | try: 48 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 49 | 50 | #联系人权限 51 | self.tester.find_element_by_id_and_tap('android:id/button1') 52 | 53 | except Exception, e: 54 | traceback.print_exc() 55 | DriverManager.quit_driver(self.tester.device.deviceid) 56 | 57 | def get_permission_process(self): 58 | try: 59 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 60 | 61 | #打开取景窗 62 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 63 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 64 | 65 | #拍照和录像权限 66 | self.tester.find_element_by_id_and_tap('android:id/button1') 67 | 68 | #录音权限 69 | self.tester.find_element_by_id_and_tap('android:id/button1') 70 | 71 | #关闭取景框 72 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 73 | 74 | except Exception, e: 75 | traceback.print_exc() 76 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/MZM2NotePreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | import subprocess 6 | from common.DataProvider import * 7 | 8 | class MZM2NotePreProcess (BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(MZM2NotePreProcess, self).__init__(tester) 12 | 13 | #魅族情况太特殊,安装都得继承然后单独处理,弹出的adb安装权限直接阻塞了Server运行 14 | def install_app(self): 15 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 16 | subprocess.call(cmd,shell=True) 17 | 18 | def install_process(self): 19 | try: 20 | Log.logger.info(u"设备:%s 安装app并处理GPS弹窗" % self.tester.device.devicename) 21 | 22 | element = self.tester.find_element_by_id('android:id/button1',20) 23 | if element != None: 24 | self.action.tap(element).perform() 25 | 26 | #启动app 27 | while self.driver.is_app_installed("com.nice.main") == False: 28 | time.sleep(2) 29 | self.driver.launch_app() 30 | 31 | # nice获取手机GPS权限 32 | self.tester.find_element_by_id_and_tap('android:id/button1') 33 | 34 | # nice获取手机识别码权限 35 | time.sleep(1) 36 | 37 | element = self.tester.find_element_by_id('android:id/button1',20) 38 | if element != None: 39 | self.action.tap(element).perform() 40 | 41 | except Exception, e: 42 | traceback.print_exc() 43 | DriverManager.quit_driver(self.tester.device.deviceid) 44 | 45 | def login_success_process(self): 46 | try: 47 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 48 | 49 | #联系人权限 50 | self.tester.find_element_by_id_and_tap('android:id/button1') 51 | 52 | except Exception, e: 53 | traceback.print_exc() 54 | DriverManager.quit_driver(self.tester.device.deviceid) 55 | 56 | def get_permission_process(self): 57 | try: 58 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 59 | 60 | #打开取景窗 61 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 62 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 63 | 64 | #录音权限 65 | self.tester.find_element_by_id_and_tap('android:id/button1') 66 | 67 | # 视频权限 68 | self.tester.find_element_by_id_and_tap('android:id/button1') 69 | 70 | #关闭取景框 71 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 72 | 73 | except Exception, e: 74 | traceback.print_exc() 75 | DriverManager.quit_driver(self.tester.device.deviceid) 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /prepro/Nexus6PreProcess.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | from BaseDevicePreProcess import * 3 | 4 | 5 | class Nexus6PreProcess(BaseDevicePreProcess): 6 | 7 | def __init__(self, tester): 8 | super(Nexus6PreProcess, self).__init__(tester) 9 | 10 | def install_process(self): 11 | try: 12 | Log.logger.info(u"设备:%s 启动app" % self.tester.device.devicename) 13 | 14 | while self.driver.is_app_installed("com.nice.main") == False: 15 | time.sleep(2) 16 | 17 | self.driver.launch_app() 18 | except Exception, e: 19 | traceback.print_exc() 20 | DriverManager.quit_driver(self.tester.device.deviceid) 21 | 22 | def login_success_process(self): 23 | try: 24 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 25 | 26 | # 第一次登陆需要三个授权:位置信息,访问照片和文件,拨打电话和管理通话 27 | for i in range(0, 3): 28 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 29 | time.sleep(1) 30 | 31 | # nice的授权通讯录弹窗 32 | # self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') #无法点击控件 33 | time.sleep(2) 34 | self.tester.tap_screen(700, 1660) 35 | 36 | # 系统的授权弹窗 37 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 38 | 39 | except Exception, e: 40 | traceback.print_exc() 41 | DriverManager.quit_driver(self.tester.device.deviceid) 42 | 43 | def get_permission_process(self): 44 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 45 | try: 46 | 47 | #self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 48 | 49 | #打开取景框 50 | time.sleep(10) 51 | self.tester.tap_screen(745, 2300) 52 | 53 | # 拍照和录制视频权限 54 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 55 | 56 | # 录制音频权限 57 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 58 | 59 | # 切换到拍摄页面 60 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 61 | 62 | # 退出取景框,回到发现页面 63 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 64 | 65 | time.sleep(10) 66 | if self.tester.is_element_exist(u'你关注人的故事和直播'): 67 | # 处理语言问题 68 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnTabProfile') 69 | while self.tester.is_element_exist('com.nice.main:id/layout_profile_setting') == False: 70 | self.tester.swipe_down() 71 | self.tester.find_element_by_id_and_tap('com.nice.main:id/layout_profile_setting') 72 | self.tester.find_element_by_id_and_tap('com.nice.main:id/layout_setting_common') 73 | self.tester.find_element_by_id_and_tap('com.nice.main:id/layout_setting_language') 74 | time.sleep(3) 75 | 76 | # 简体中文语言 77 | if self.tester.is_element_exist(u'简体中文'): 78 | self.tester.back_to_feed() 79 | else: 80 | self.tester.find_element_by_id_and_tap('com.nice.main:id/layout_setting_language') 81 | time.sleep(2) 82 | self.tester.find_element_by_xpath_and_tap('//android.widget.TextView[2]') 83 | self.tester.back_to_feed() 84 | else: 85 | print 'nexus6目前是简体中文' 86 | 87 | except Exception, e: 88 | traceback.print_exc() 89 | DriverManager.quit_driver(self.tester.device.deviceid) 90 | 91 | -------------------------------------------------------------------------------- /prepro/ONEPlusXPreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class ONEPlusXPreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(ONEPlusXPreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | except Exception, e: 21 | traceback.print_exc() 22 | DriverManager.quit_driver(self.tester.device.deviceid) 23 | 24 | def login_success_process(self): 25 | pass 26 | 27 | def get_permission_process(self): 28 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 29 | try: 30 | #打开取景框 31 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 32 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 33 | 34 | # 退出取景框,回到发现页面 35 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 36 | except Exception, e: 37 | traceback.print_exc() 38 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/OPPOA33PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class OPPOA33PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(OPPOA33PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 21 | self.tester.find_element_by_id_and_tap('android:id/button1') 22 | 23 | except Exception, e: 24 | traceback.print_exc() 25 | DriverManager.quit_driver(self.tester.device.deviceid) 26 | 27 | def login_success_process(self): 28 | try: 29 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 30 | self.tester.find_element_by_id_and_tap('android:id/button1') 31 | 32 | except Exception, e: 33 | traceback.print_exc() 34 | DriverManager.quit_driver(self.tester.device.deviceid) 35 | 36 | def get_permission_process(self): 37 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 38 | try: 39 | #打开取景框 40 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 41 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 42 | 43 | # 摄像头权限 44 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 45 | self.tester.find_element_by_id_and_tap('android:id/button1') 46 | 47 | # 录音权限 48 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 49 | self.tester.find_element_by_id_and_tap('android:id/button1') 50 | 51 | #退出取景框,回到发现页面 52 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 53 | 54 | except Exception, e: 55 | traceback.print_exc() 56 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/OPPOA37PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from OPPOR9PreProcess import * 5 | 6 | #处理过程跟OPPOR9一样,所以直接继承OPPOR9处理类 7 | class OPPOA37PreProcess (OPPOR9PreProcess): 8 | 9 | def __init__(self,tester): 10 | super(OPPOA37PreProcess, self).__init__(tester) 11 | 12 | -------------------------------------------------------------------------------- /prepro/OPPOA59PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class OPPOA59PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(OPPOA59PreProcess, self).__init__(tester) 10 | 11 | def install_app(self): 12 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 13 | subprocess.call(cmd,shell=True) 14 | 15 | def install_process(self): 16 | Log.logger.info(u"设备:%s 处理安装中各种弹窗" % self.tester.device.devicename) 17 | try: 18 | time.sleep(5) 19 | if self.tester.is_element_exist(u'静默安装拦截',10): 20 | self.tester.find_element_by_id_and_tap('com.kingroot.kinguser:id/checkbox_remember') 21 | self.tester.find_element_by_id_and_tap('com.kingroot.kinguser:id/button_right') 22 | 23 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/btn_allow_once',60) 24 | except TimeoutException,e: 25 | traceback.print_exc() 26 | finally: 27 | try: 28 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/bottom_button_two') 29 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/bottom_button_two') 30 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 31 | self.tester.find_element_by_id_and_tap('android:id/button1') 32 | except Exception, e: 33 | traceback.print_exc() 34 | DriverManager.quit_driver(self.tester.device.deviceid) 35 | 36 | def login_success_process(self): 37 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 38 | try: 39 | self.tester.find_element_by_id_and_tap('android:id/button1') 40 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_cancel') 41 | except Exception, e: 42 | traceback.print_exc() 43 | DriverManager.quit_driver(self.tester.device.deviceid) 44 | 45 | def get_permission_process(self): 46 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 47 | try: 48 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 49 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 50 | 51 | #摄像机权限 52 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 53 | self.tester.find_element_by_id_and_tap('android:id/button1') 54 | 55 | #录音权限 56 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 57 | self.tester.find_element_by_id_and_tap('android:id/button1') 58 | 59 | #关闭取景框 60 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 61 | 62 | except Exception, e: 63 | traceback.print_exc() 64 | DriverManager.quit_driver(self.tester.device.deviceid) 65 | -------------------------------------------------------------------------------- /prepro/OPPON5207PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class OPPON5207PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(OPPON5207PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 21 | self.tester.find_element_by_id_and_tap('android:id/button1') 22 | 23 | except Exception, e: 24 | traceback.print_exc() 25 | DriverManager.quit_driver(self.tester.device.deviceid) 26 | 27 | def login_success_process(self): 28 | try: 29 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 30 | self.tester.find_element_by_id_and_tap('android:id/button1') 31 | 32 | except Exception, e: 33 | traceback.print_exc() 34 | DriverManager.quit_driver(self.tester.device.deviceid) 35 | 36 | def get_permission_process(self): 37 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 38 | try: 39 | #打开取景框 40 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 41 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 42 | 43 | # 摄像头权限 44 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 45 | self.tester.find_element_by_id_and_tap('android:id/button1') 46 | 47 | # 录音权限 48 | element = self.tester.find_element_by_id("oppo:id/remember_cb") 49 | if element != None: 50 | self.action.tap(element).perform() 51 | self.tester.find_element_by_id_and_tap('android:id/button1') 52 | 53 | #退出取景框,回到发现页面 54 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 55 | 56 | except Exception, e: 57 | traceback.print_exc() 58 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/OPPOR7sPreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class OPPOR7sPreProcess(BaseDevicePreProcess): 7 | 8 | def __init__(self, tester): 9 | super(OPPOR7sPreProcess, self).__init__(tester) 10 | 11 | # 无法获取空间信息,使用坐标点击 12 | def install_process(self): 13 | Log.logger.info(u"设备:%s 处理安装中各种弹窗" % self.tester.device.devicename) 14 | 15 | try: 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | self.driver.launch_app() 19 | # 点击弹窗不再提醒GPS允许 20 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 21 | time.sleep(2) 22 | # 点击GPS允许 23 | self.tester.find_element_by_id_and_tap('android:id/button1') 24 | except TimeoutException, e: 25 | traceback.print_exc() 26 | DriverManager.quit_driver(self.tester.device.deviceid) 27 | 28 | def login_success_process(self): 29 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 30 | try: 31 | self.tester.find_element_by_id_and_tap('android:id/button1') 32 | except Exception, e: 33 | traceback.print_exc() 34 | DriverManager.quit_driver(self.tester.device.deviceid) 35 | 36 | def get_permission_process(self): 37 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 38 | try: 39 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 40 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 41 | 42 | #摄像机权限 43 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 44 | self.tester.find_element_by_id_and_tap('android:id/button1') 45 | 46 | #录音权限 47 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 48 | self.tester.find_element_by_id_and_tap('android:id/button1') 49 | 50 | #关闭取景框 51 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 52 | 53 | except Exception, e: 54 | traceback.print_exc() 55 | DriverManager.quit_driver(self.tester.device.deviceid) 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /prepro/OPPOR8700PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class OPPOR8700PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(OPPOR8700PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | while self.driver.is_app_installed("com.nice.main") == False: 17 | time.sleep(2) 18 | 19 | self.driver.launch_app() 20 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 21 | self.tester.find_element_by_id_and_tap('android:id/button1') 22 | 23 | except Exception, e: 24 | traceback.print_exc() 25 | DriverManager.quit_driver(self.tester.device.deviceid) 26 | 27 | def login_success_process(self): 28 | try: 29 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 30 | try: 31 | self.tester.find_element_by_id_and_tap('android:id/button1') 32 | except: 33 | print 'err' 34 | except Exception, e: 35 | traceback.print_exc() 36 | DriverManager.quit_driver(self.tester.device.deviceid) 37 | 38 | def get_permission_process(self): 39 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 40 | try: 41 | #打开取景框 42 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 43 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 44 | 45 | # 摄像头权限 46 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 47 | self.tester.find_element_by_id_and_tap('android:id/button1') 48 | 49 | # 录音权限 50 | # 录音权限 51 | element = self.tester.find_element_by_id("oppo:id/remember_cb") 52 | if element != None: 53 | self.action.tap(element).perform() 54 | self.tester.find_element_by_id_and_tap('android:id/button1') 55 | 56 | #退出取景框,回到发现页面 57 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 58 | 59 | except Exception, e: 60 | traceback.print_exc() 61 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/OPPOR9PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class OPPOR9PreProcess(BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(OPPOR9PreProcess, self).__init__(tester) 10 | 11 | def install_process(self): 12 | Log.logger.info(u"设备:%s 处理安装中各种弹窗" % self.tester.device.devicename) 13 | try: 14 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/btn_allow_once',60) 15 | except TimeoutException,e: 16 | traceback.print_exc() 17 | finally: 18 | try: 19 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/bottom_button_two') 20 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/bottom_button_two') 21 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 22 | self.tester.find_element_by_id_and_tap('android:id/button1') 23 | except Exception, e: 24 | traceback.print_exc() 25 | DriverManager.quit_driver(self.tester.device.deviceid) 26 | 27 | def login_success_process(self): 28 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 29 | try: 30 | self.tester.find_element_by_id_and_tap('android:id/button1') 31 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_cancel') 32 | except Exception, e: 33 | traceback.print_exc() 34 | DriverManager.quit_driver(self.tester.device.deviceid) 35 | 36 | def get_permission_process(self): 37 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 38 | try: 39 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 40 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 41 | 42 | #摄像机权限 43 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 44 | self.tester.find_element_by_id_and_tap('android:id/button1') 45 | 46 | #录音权限 47 | self.tester.find_element_by_id_and_tap('oppo:id/remember_cb') 48 | self.tester.find_element_by_id_and_tap('android:id/button1') 49 | 50 | #关闭取景框 51 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 52 | 53 | except Exception, e: 54 | traceback.print_exc() 55 | DriverManager.quit_driver(self.tester.device.deviceid) 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /prepro/RedMi1sPreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class RedMi1sPreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(RedMi1sPreProcess, self).__init__(tester) 10 | 11 | def install_process(self): 12 | try: 13 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 14 | 15 | element = self.tester.find_element_by_id("com.kingroot.kinguser:id/checkbox_remember",20) 16 | if element != None: 17 | self.action.tap(element).perform() 18 | self.tester.find_element_by_id_and_tap('com.kingroot.kinguser:id/button_right') 19 | 20 | 21 | element = self.tester.find_element_by_id("com.android.packageinstaller:id/ok_button",60) 22 | if element != None: 23 | self.action.tap(element).perform() 24 | 25 | while self.driver.is_app_installed("com.nice.main") == False: 26 | time.sleep(2) 27 | 28 | self.driver.launch_app() 29 | 30 | except Exception, e: 31 | traceback.print_exc() 32 | DriverManager.quit_driver(self.tester.device.deviceid) 33 | 34 | def login_success_process(self): 35 | try: 36 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 37 | # #联系人权限 38 | # self.tester.find_element_by_id_and_tap('com.lbe.security.miui:id/accept') 39 | except Exception,e: 40 | traceback.print_exc() 41 | DriverManager.quit_driver(self.tester.device.deviceid) 42 | 43 | def get_permission_process(self): 44 | try: 45 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 46 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 47 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 48 | 49 | # #录音权限 50 | # self.tester.find_element_by_id_and_tap('com.lbe.security.miui:id/accept') 51 | 52 | #关闭取景框 53 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 54 | 55 | except Exception, e: 56 | traceback.print_exc() 57 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/RedMi2APreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class RedMi2APreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(RedMi2APreProcess, self).__init__(tester) 10 | 11 | def install_app(self): 12 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid, DataProvider.niceapk) 13 | subprocess.call(cmd, shell=True) 14 | 15 | def install_process(self): 16 | try: 17 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 18 | 19 | time.sleep(5) 20 | self.tester.find_element_by_id_and_tap('com.miui.securitycenter:id/do_not_ask_checkbox') 21 | self.tester.find_element_by_id_and_tap('android:id/button2') 22 | 23 | while self.driver.is_app_installed("com.nice.main") == False: 24 | time.sleep(2) 25 | 26 | self.driver.launch_app() 27 | 28 | except Exception, e: 29 | traceback.print_exc() 30 | DriverManager.quit_driver(self.tester.device.deviceid) 31 | 32 | def login_success_process(self): 33 | try: 34 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 35 | # #联系人权限 36 | self.tester.find_element_by_id_and_tap('android:id/button1') 37 | except Exception,e: 38 | traceback.print_exc() 39 | DriverManager.quit_driver(self.tester.device.deviceid) 40 | 41 | def get_permission_process(self): 42 | try: 43 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 44 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 45 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 46 | 47 | #录音权限 48 | self.tester.find_element_by_id_and_tap('android:id/button1') 49 | 50 | #关闭取景框 51 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 52 | 53 | except Exception, e: 54 | traceback.print_exc() 55 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/RedMiNote2PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class RedMiNote2PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(RedMiNote2PreProcess, self).__init__(tester) 10 | 11 | def install_process(self): 12 | try: 13 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 14 | 15 | while self.driver.is_app_installed("com.nice.main") == False: 16 | time.sleep(2) 17 | self.driver.launch_app() 18 | 19 | except Exception, e: 20 | traceback.print_exc() 21 | DriverManager.quit_driver(self.tester.device.deviceid) 22 | 23 | def login_success_process(self): 24 | try: 25 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 26 | #联系人权限 27 | self.tester.find_element_by_id_and_tap('com.lbe.security.miui:id/accept') 28 | except Exception,e: 29 | traceback.print_exc() 30 | DriverManager.quit_driver(self.tester.device.deviceid) 31 | 32 | def get_permission_process(self): 33 | try: 34 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 35 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 36 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 37 | 38 | #录音权限 39 | self.tester.find_element_by_id_and_tap('com.lbe.security.miui:id/accept') 40 | 41 | #关闭取景框 42 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 43 | 44 | except Exception, e: 45 | traceback.print_exc() 46 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/RedMiNote3PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from RedMiNote2PreProcess import * 5 | 6 | #处理过程跟红米note2一样 7 | class RedMiNote3PreProcess (RedMiNote2PreProcess): 8 | 9 | def __init__(self,tester): 10 | super(RedMiNote3PreProcess, self).__init__(tester) 11 | 12 | -------------------------------------------------------------------------------- /prepro/RedMiNote4PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class RedMiNote4PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(RedMiNote4PreProcess, self).__init__(tester) 10 | 11 | def install_app(self): 12 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid, DataProvider.niceapk) 13 | subprocess.call(cmd,shell=True) 14 | 15 | def install_process(self): 16 | try: 17 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 18 | 19 | self.tester.find_element_by_id_and_tap('com.miui.securitycenter:id/do_not_ask_checkbox') 20 | self.tester.find_element_by_id_and_tap('android:id/button2') 21 | 22 | while self.driver.is_app_installed("com.nice.main") == False: 23 | time.sleep(2) 24 | self.driver.launch_app() 25 | 26 | except Exception, e: 27 | traceback.print_exc() 28 | DriverManager.quit_driver(self.tester.device.deviceid) 29 | 30 | def login_success_process(self): 31 | try: 32 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 33 | 34 | for i in range(0, 3): 35 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 36 | time.sleep(1) 37 | 38 | # nice的授权通讯录弹窗 39 | # self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') #无法点击控件 40 | time.sleep(2) 41 | # self.tester.tap_screen(555, 1360) 42 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') 43 | 44 | # 系统的授权弹窗 45 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 46 | 47 | except Exception,e: 48 | traceback.print_exc() 49 | DriverManager.quit_driver(self.tester.device.deviceid) 50 | 51 | def get_permission_process(self): 52 | try: 53 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 54 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 55 | # self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 56 | 57 | #录音权限 58 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 59 | time.sleep(1) 60 | #视频权限 61 | self.tester.find_element_by_id_and_tap('com.android.packageinstaller:id/permission_allow_button') 62 | 63 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 64 | #关闭取景框 65 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 66 | 67 | except Exception, e: 68 | traceback.print_exc() 69 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/Smartisan1PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | import subprocess 6 | from common.DataProvider import * 7 | 8 | class Smartosan1PreProcess (BaseDevicePreProcess): 9 | 10 | def __init__(self,tester): 11 | super(Smartosan1PreProcess, self).__init__(tester) 12 | 13 | #魅族情况太特殊,安装都得继承然后单独处理,弹出的adb安装权限直接阻塞了Server运行 14 | def install_app(self): 15 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 16 | subprocess.call(cmd,shell=True) 17 | 18 | 19 | def install_process(self): 20 | try: 21 | Log.logger.info(u"设备:%s 安装app并处理GPS弹窗" % self.tester.device.devicename) 22 | 23 | #adb安装权限 24 | self.tester.find_element_by_id_and_tap('android:id/button1') 25 | 26 | #启动app 27 | while self.driver.is_app_installed("com.nice.main") == False: 28 | time.sleep(2) 29 | self.driver.launch_app() 30 | 31 | # #获取位置信息 32 | # time.sleep(5) 33 | # self.tester.find_element_by_id_and_tap('android:id/button1') 34 | 35 | except Exception, e: 36 | traceback.print_exc() 37 | DriverManager.quit_driver(self.tester.device.deviceid) 38 | # 该流程包括点击login按钮到达登录页面,并登录 39 | 40 | def login_process(self): 41 | Log.logger.info(u"设备:%s 开始登录,使用账号:%s" % (self.tester.device.devicename, self.tester.user.mobile)) 42 | try: 43 | # 新老注册流程的登录按钮使用的是同一个resource_id,对登录按钮不用做特殊判断 44 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 45 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number', self.user.mobile) 46 | self.tester.find_element_by_id_and_tap('com.nice.main:id/password') 47 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password', self.user.password) 48 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 49 | 50 | time.sleep(1) 51 | self.tester.screenshot(u"登录成功") 52 | except Exception, e: 53 | raise 54 | def login_success_process(self): 55 | try: 56 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 57 | 58 | element = self.tester.find_element_by_id("android:id/button1") 59 | if element != None: 60 | self.action.tap(element).perform() 61 | 62 | except Exception, e: 63 | traceback.print_exc() 64 | DriverManager.quit_driver(self.tester.device.deviceid) 65 | 66 | def get_permission_process(self): 67 | try: 68 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 69 | 70 | #打开取景窗 71 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 72 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 73 | 74 | time.sleep(3) 75 | # 权限 76 | self.tester.find_element_by_id_and_tap('android:id/button1') 77 | 78 | # 权限 79 | self.tester.find_element_by_id_and_tap('android:id/button1') 80 | 81 | #关闭取景框 82 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 83 | 84 | except Exception, e: 85 | traceback.print_exc() 86 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/Smartisan705PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | #!usr/bin/python 5 | # -*- coding:utf-8 -*- 6 | 7 | from BaseDevicePreProcess import * 8 | 9 | class Smartisan705Process (BaseDevicePreProcess): 10 | 11 | def __init__(self,tester): 12 | super(Smartisan705Process, self).__init__(tester) 13 | 14 | 15 | def install_process(self): 16 | try: 17 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 18 | 19 | while self.driver.is_app_installed("com.nice.main") == False: 20 | time.sleep(2) 21 | 22 | self.driver.launch_app() 23 | except Exception, e: 24 | traceback.print_exc() 25 | DriverManager.quit_driver(self.tester.device.deviceid) 26 | 27 | def login_success_process(self): 28 | try: 29 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 30 | 31 | except Exception, e: 32 | traceback.print_exc() 33 | DriverManager.quit_driver(self.tester.device.deviceid) 34 | 35 | def get_permission_process(self): 36 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 37 | try: 38 | #打开取景框 39 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 40 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 41 | 42 | time.sleep(3) 43 | # 权限 44 | self.tester.find_element_by_id_and_tap('android:id/button1') 45 | 46 | # 权限 47 | self.tester.find_element_by_id_and_tap('android:id/button1') 48 | 49 | # 退出取景框,回到发现页面 50 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 51 | except Exception, e: 52 | traceback.print_exc() 53 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/SumSing9152PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class SumSing9152PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(SumSing9152PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | while self.driver.is_app_installed("com.nice.main") == False: 16 | time.sleep(2) 17 | 18 | self.driver.launch_app() 19 | 20 | 21 | #self.tester.find_element_by_uiautomator_and_tap(u'new UiSelector().textContains(\"允许\").fromParent(new UiSelector().className(\"android.widget.Button\"))') 22 | 23 | except Exception, e: 24 | traceback.print_exc() 25 | DriverManager.quit_driver(self.tester.device.deviceid) 26 | 27 | def login_success_process(self): 28 | try: 29 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 30 | 31 | # self.tester.find_element_by_uiautomator_and_tap( 32 | # u'new UiSelector().textContains(\"允许\").fromParent(new UiSelector().className(\"android.widget.Button\"))') 33 | 34 | except Exception, e: 35 | traceback.print_exc() 36 | DriverManager.quit_driver(self.tester.device.deviceid) 37 | 38 | def get_permission_process(self): 39 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 40 | try: 41 | # 打开取景框 42 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 43 | 44 | # 切换到拍摄tab 45 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 46 | 47 | self.tester.press_keycode(4) 48 | 49 | time.sleep(1) 50 | except Exception, e: 51 | traceback.print_exc() 52 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/SumSingNote3PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class SumSingNote3PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(SumSingNote3PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | while self.driver.is_app_installed("com.nice.main") == False: 16 | time.sleep(2) 17 | 18 | #点击确认应用程序许可按钮 19 | self.tester.find_element_by_id_and_tap('com.android.settings:id/button') 20 | 21 | self.driver.launch_app() 22 | 23 | except Exception, e: 24 | traceback.print_exc() 25 | DriverManager.quit_driver(self.tester.device.deviceid) 26 | 27 | def login_success_process(self): 28 | try: 29 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 30 | 31 | except Exception, e: 32 | traceback.print_exc() 33 | DriverManager.quit_driver(self.tester.device.deviceid) 34 | 35 | def get_permission_process(self): 36 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 37 | try: 38 | #打开取景框 39 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 40 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 41 | 42 | # 退出取景框,回到发现页面 43 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 44 | except Exception, e: 45 | traceback.print_exc() 46 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/SumSingNote4PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from SumSingNote3PreProcess import * 5 | 6 | #处理过程跟三星note3一样,所以直接继承三星note3处理类 7 | class SumSingNote4PreProcess (SumSingNote3PreProcess): 8 | 9 | def __init__(self,tester): 10 | super(SumSingNote4PreProcess, self).__init__(tester) 11 | 12 | def login_process(self): 13 | Log.logger.info(u"设备:%s 开始登录,使用账号:%s" % (self.tester.device.devicename, self.tester.user.mobile)) 14 | try: 15 | # 新老注册流程的登录按钮使用的是同一个resource_id,对登录按钮不用做特殊判断 16 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 17 | 18 | time.sleep(3) 19 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number', self.user.mobile) 20 | 21 | time.sleep(3) 22 | self.tester.find_element_by_id_and_tap('com.nice.main:id/password') 23 | self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password', self.user.password) 24 | time.sleep(3) 25 | self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 26 | 27 | while self.tester.is_element_exist(u'手机号位数不对'): 28 | self.tester.find_element_by_id('com.nice.main:id/phone_number') 29 | 30 | except Exception,e: 31 | raise -------------------------------------------------------------------------------- /prepro/SumSingS4PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from BaseDevicePreProcess import * 5 | 6 | class SumSingS4PreProcess (BaseDevicePreProcess): 7 | 8 | def __init__(self,tester): 9 | super(SumSingS4PreProcess, self).__init__(tester) 10 | 11 | 12 | def install_process(self): 13 | try: 14 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 15 | 16 | time.sleep(5) 17 | if self.tester.is_element_exist(u'静默安装拦截', 10): 18 | self.tester.find_element_by_id_and_tap('com.kingroot.kinguser:id/checkbox_remember') 19 | self.tester.find_element_by_id_and_tap('com.kingroot.kinguser:id/button_right') 20 | 21 | while self.driver.is_app_installed("com.nice.main") == False: 22 | time.sleep(2) 23 | 24 | #点击确认应用程序许可按钮 25 | self.tester.find_element_by_id_and_tap('com.android.settings:id/button') 26 | 27 | self.driver.launch_app() 28 | 29 | except Exception, e: 30 | traceback.print_exc() 31 | DriverManager.quit_driver(self.tester.device.deviceid) 32 | 33 | def login_success_process(self): 34 | try: 35 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 36 | 37 | except Exception, e: 38 | traceback.print_exc() 39 | DriverManager.quit_driver(self.tester.device.deviceid) 40 | 41 | def get_permission_process(self): 42 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 43 | try: 44 | #打开取景框 45 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 46 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 47 | 48 | # 退出取景框,回到发现页面 49 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 50 | except Exception, e: 51 | traceback.print_exc() 52 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/VIVOV3MAXPreProecss.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | import subprocess 4 | 5 | from BaseDevicePreProcess import * 6 | 7 | class VIVOV3MAXPreProcess(BaseDevicePreProcess): 8 | 9 | def __init__(self,tester): 10 | super(VIVOV3MAXPreProcess, self).__init__(tester) 11 | 12 | def install_app(self): 13 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid, DataProvider.niceapk) 14 | subprocess.call(cmd, shell=True) 15 | time.sleep(3) 16 | 17 | 18 | def install_process(self): 19 | try: 20 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 21 | 22 | # self.tester.find_element_by_uiautomator_and_tap("android:id/button1") 23 | time.sleep(7) 24 | self.tester.tap_screen(340, 1215) 25 | 26 | # self.tester.find_element_by_uiautomator_and_tap("vivo:id/vivo_adb_install_ok_button") 27 | time.sleep(7) 28 | self.tester.tap_screen(303, 1846) 29 | 30 | while self.driver.is_app_installed("com.nice.main") == False: 31 | time.sleep(2) 32 | 33 | self.driver.launch_app() 34 | 35 | 36 | #GPS权限 37 | # self.tester.find_element_by_uiautomator_and_tap("android:id/button1") 38 | time.sleep(7) 39 | self.tester.tap_screen(324, 1240) 40 | 41 | except Exception, e: 42 | traceback.print_exc() 43 | DriverManager.quit_driver(self.tester.device.deviceid) 44 | 45 | def login_success_process(self): 46 | try: 47 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 48 | #联系人权限 49 | time.sleep(7) 50 | self.tester.tap_screen(320, 1244) 51 | 52 | self.tester.find_element_by_id_and_tap('android:id/button1') 53 | 54 | except Exception,e: 55 | traceback.print_exc() 56 | DriverManager.quit_driver(self.tester.device.deviceid) 57 | 58 | def get_permission_process(self): 59 | try: 60 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 61 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 62 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 63 | 64 | #相机权限 65 | self.tester.find_element_by_uiautomator_and_tap("android:id/button1") 66 | 67 | #录音权限 68 | self.tester.find_element_by_uiautomator_and_tap("android:id/button1") 69 | 70 | #关闭取景框 71 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 72 | 73 | except Exception, e: 74 | traceback.print_exc() 75 | DriverManager.quit_driver(self.tester.device.deviceid) -------------------------------------------------------------------------------- /prepro/VIVOX5ProPreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | import subprocess 4 | 5 | from BaseDevicePreProcess import * 6 | 7 | class VIVOX5ProPreProcess(BaseDevicePreProcess): 8 | 9 | def __init__(self, tester): 10 | super(VIVOX5ProPreProcess, self).__init__(tester) 11 | 12 | def install_app(self): 13 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid, DataProvider.niceapk) 14 | subprocess.call(cmd, shell=True) 15 | time.sleep(3) 16 | 17 | def install_process(self): 18 | Log.logger.info(u"设备:%s 处理安装中各种弹窗" % self.tester.device.devicename) 19 | 20 | try: 21 | # 点击安装时adb授权提示 22 | self.tester.find_element_by_id_and_tap('vivo:id/vivo_adb_install_ok_button') 23 | 24 | while self.driver.is_app_installed("com.nice.main") == False: 25 | time.sleep(2) 26 | 27 | # 启动APP 28 | self.driver.launch_app() 29 | 30 | # GPS权限 31 | # self.tester.find_element_by_uiautomator_and_tap("android:id/button1") #奇怪的弹窗,无法正常点击,用坐标代替 32 | time.sleep(3) 33 | self.tester.tap_screen(287, 1250) 34 | 35 | except Exception, e: 36 | traceback.print_exc() 37 | DriverManager.quit_driver(self.tester.device.deviceid) 38 | 39 | def login_success_process(self): 40 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 41 | try: 42 | self.tester.find_element_by_id_and_tap('android:id/button1') 43 | except Exception, e: 44 | traceback.print_exc() 45 | DriverManager.quit_driver(self.tester.device.deviceid) 46 | 47 | def get_permission_process(self): 48 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 49 | try: 50 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 51 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 52 | 53 | #摄像机权限 54 | self.tester.find_element_by_id_and_tap('android:id/button1') 55 | 56 | #录音权限 57 | self.tester.find_element_by_id_and_tap('android:id/button1') 58 | 59 | #关闭取景框 60 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 61 | 62 | except Exception, e: 63 | traceback.print_exc() 64 | DriverManager.quit_driver(self.tester.device.deviceid) 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /prepro/VivoX7PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | import subprocess 4 | 5 | from BaseDevicePreProcess import * 6 | 7 | class VivoX7ProPreProcess(BaseDevicePreProcess): 8 | 9 | def __init__(self, tester): 10 | super(VivoX7ProPreProcess, self).__init__(tester) 11 | 12 | def install_app(self): 13 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid, DataProvider.niceapk) 14 | subprocess.call(cmd, shell=True) 15 | time.sleep(3) 16 | 17 | def install_process(self): 18 | Log.logger.info(u"设备:%s 处理安装中各种弹窗" % self.tester.device.devicename) 19 | 20 | try: 21 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 22 | time.sleep(7) 23 | self.tester.tap_screen(306, 1228) 24 | 25 | time.sleep(7) 26 | self.tester.tap_screen(260, 1855) 27 | 28 | while self.driver.is_app_installed("com.nice.main") == False: 29 | time.sleep(2) 30 | 31 | # 启动APP 32 | self.driver.launch_app() 33 | 34 | # GPS权限 35 | time.sleep(7) 36 | self.tester.tap_screen(284, 1290) 37 | 38 | except Exception, e: 39 | traceback.print_exc() 40 | DriverManager.quit_driver(self.tester.device.deviceid) 41 | 42 | # 该流程包括点击login按钮到达登录页面,并登录 43 | 44 | def login_success_process(self): 45 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 46 | try: 47 | # 联系人权限 48 | time.sleep(7) 49 | self.tester.tap_screen(316, 1315) 50 | 51 | except Exception, e: 52 | traceback.print_exc() 53 | DriverManager.quit_driver(self.tester.device.deviceid) 54 | 55 | def get_permission_process(self): 56 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 57 | try: 58 | # 打开取景框 59 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 60 | 61 | # 切换到拍摄tab 62 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 63 | 64 | #摄像机权限 65 | self.tester.find_element_by_id_and_tap('android:id/button1') 66 | 67 | #录音权限 68 | self.tester.find_element_by_id_and_tap('android:id/button1') 69 | 70 | #关闭取景框 71 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 72 | 73 | except Exception, e: 74 | traceback.print_exc() 75 | DriverManager.quit_driver(self.tester.device.deviceid) 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /prepro/XIAOMI2PreProcess.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | from BaseDevicePreProcess import * 3 | 4 | 5 | class XIAOMI2PreProcess (BaseDevicePreProcess): 6 | 7 | def __init__(self,tester): 8 | super(XIAOMI2PreProcess, self).__init__(tester) 9 | 10 | def install_process(self): 11 | try: 12 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 13 | 14 | while self.driver.is_app_installed("com.nice.main") == False: 15 | time.sleep(2) 16 | 17 | self.driver.launch_app() 18 | except Exception, e: 19 | traceback.print_exc() 20 | DriverManager.quit_driver(self.tester.device.deviceid) 21 | 22 | def login_success_process(self): 23 | try: 24 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 25 | 26 | 27 | #授权通讯录弹框 28 | # self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') 29 | 30 | #授权联系人权限 31 | self.tester.find_element_by_id_and_tap('android:id/button1') 32 | 33 | except Exception, e: 34 | traceback.print_exc() 35 | DriverManager.quit_driver(self.tester.device.deviceid) 36 | 37 | def get_permission_process(self): 38 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 39 | try: 40 | #打开取景框 41 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 42 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 43 | 44 | element = self.tester.find_element_by_id("android:id/button1") 45 | if element != None: 46 | self.action.tap(element).perform() 47 | 48 | element = self.tester.find_element_by_id("android:id/button1",20) 49 | if element != None: 50 | self.action.tap(element).perform() 51 | 52 | # 退出取景框,回到发现页面 53 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 54 | 55 | except Exception, e: 56 | traceback.print_exc() 57 | DriverManager.quit_driver(self.tester.device.deviceid) 58 | 59 | -------------------------------------------------------------------------------- /prepro/XIAOMI3PreProcess.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | from BaseDevicePreProcess import * 3 | 4 | 5 | class XIAOMI3PreProcess (BaseDevicePreProcess): 6 | 7 | def __init__(self,tester): 8 | super(XIAOMI3PreProcess, self).__init__(tester) 9 | 10 | def install_process(self): 11 | try: 12 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 13 | 14 | while self.driver.is_app_installed("com.nice.main") == False: 15 | time.sleep(2) 16 | 17 | self.driver.launch_app() 18 | except Exception, e: 19 | traceback.print_exc() 20 | DriverManager.quit_driver(self.tester.device.deviceid) 21 | 22 | # def login_process(self): 23 | # Log.logger.info(u"设备:%s 开始登录,使用账号:%s" % (self.tester.device.devicename, self.tester.user.mobile)) 24 | # try: 25 | # # 新老注册流程的登录按钮使用的是同一个resource_id,对登录按钮不用做特殊判断 26 | # self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 27 | # 28 | # while self.tester.is_element_exist('com.nice.main:id/phone_number') == False: 29 | # self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 30 | # time.sleep(2) 31 | # 32 | # self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number', self.user.mobile) 33 | # self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password', self.user.password) 34 | # 35 | # while self.tester.is_element_exist('com.nice.main:id/login'): 36 | # self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 37 | # time.sleep(1) 38 | # 39 | # self.tester.screenshot(u"登录成功") 40 | # except Exception,e: 41 | # raise 42 | 43 | def login_success_process(self): 44 | try: 45 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 46 | 47 | 48 | #授权通讯录弹框 49 | # self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') 50 | 51 | #授权联系人权限 52 | self.tester.find_element_by_id_and_tap('android:id/button1') 53 | 54 | except Exception, e: 55 | traceback.print_exc() 56 | DriverManager.quit_driver(self.tester.device.deviceid) 57 | 58 | def get_permission_process(self): 59 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 60 | try: 61 | #打开取景框 62 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 63 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 64 | 65 | element = self.tester.find_element_by_id("android:id/button1") 66 | if element != None: 67 | self.action.tap(element).perform() 68 | 69 | element = self.tester.find_element_by_id("android:id/button1",20) 70 | if element != None: 71 | self.action.tap(element).perform() 72 | 73 | # 退出取景框,回到发现页面 74 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 75 | 76 | except Exception, e: 77 | traceback.print_exc() 78 | DriverManager.quit_driver(self.tester.device.deviceid) 79 | 80 | -------------------------------------------------------------------------------- /prepro/XIAOMI4PreProcess.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | from BaseDevicePreProcess import * 3 | 4 | class XIAOMI4PreProcess (BaseDevicePreProcess): 5 | 6 | def __init__(self,tester): 7 | super(XIAOMI4PreProcess, self).__init__(tester) 8 | 9 | def install_app(self): 10 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid, DataProvider.niceapk) 11 | subprocess.call(cmd,shell=True) 12 | 13 | def install_process(self): 14 | try: 15 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 16 | 17 | time.sleep(3) 18 | self.tester.find_element_by_id_and_tap('com.miui.securitycenter:id/do_not_ask_checkbox') 19 | 20 | self.tester.find_element_by_id_and_tap('android:id/button2') 21 | 22 | while self.driver.is_app_installed("com.nice.main") == False: 23 | time.sleep(2) 24 | 25 | self.driver.launch_app() 26 | 27 | except Exception, e: 28 | traceback.print_exc() 29 | DriverManager.quit_driver(self.tester.device.deviceid) 30 | 31 | # def login_process(self): 32 | # Log.logger.info(u"设备:%s 开始登录,使用账号:%s" % (self.tester.device.devicename, self.tester.user.mobile)) 33 | # try: 34 | # 35 | # 36 | # # self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 37 | # time.sleep(10) 38 | # self.tester.find_element_by_id_and_send_keys('com.nice.main:id/phone_number', self.user.mobile) 39 | # self.tester.find_element_by_id_and_send_keys('com.nice.main:id/password', self.user.password) 40 | # self.tester.find_element_by_id_and_tap('com.nice.main:id/login') 41 | # 42 | # time.sleep(3) 43 | # 44 | # self.tester.longin_with_verifycode() 45 | # self.tester.screenshot(u"登录成功") 46 | # except Exception,e: 47 | # raise 48 | # 49 | 50 | def login_success_process(self): 51 | try: 52 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 53 | 54 | # 授权通讯录弹框 55 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') 56 | 57 | #授权联系人权限 58 | self.tester.find_element_by_id_and_tap('android:id/button1') 59 | 60 | time.sleep(5) 61 | if self.tester.is_element_exist('com.nice.main:id/btn_know'): 62 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_know') 63 | 64 | except Exception, e: 65 | traceback.print_exc() 66 | DriverManager.quit_driver(self.tester.device.deviceid) 67 | 68 | def get_permission_process(self): 69 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 70 | try: 71 | #打开取景框 72 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 73 | 74 | 75 | # 摄像头权限 76 | self.tester.find_element_by_id_and_tap('android:id/button1') 77 | 78 | # 录音权限 79 | self.tester.find_element_by_id_and_tap('android:id/button1') 80 | 81 | self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 82 | 83 | # 退出取景框,回到发现页面 84 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_return') 85 | except Exception, e: 86 | traceback.print_exc() 87 | DriverManager.quit_driver(self.tester.device.deviceid) 88 | 89 | -------------------------------------------------------------------------------- /prepro/XIAOMI5PreProcess.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from XIAOMINOTEPreProcess import * 5 | 6 | 7 | class XIAOMI5PreProcess (XIAOMINOTEPreProcess): 8 | 9 | def __init__(self,tester): 10 | super(XIAOMI5PreProcess, self).__init__(tester) 11 | -------------------------------------------------------------------------------- /prepro/XIAOMINOTEPreProcess.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | from BaseDevicePreProcess import * 3 | 4 | 5 | class XIAOMINOTEPreProcess (BaseDevicePreProcess): 6 | 7 | def __init__(self,tester): 8 | super(XIAOMINOTEPreProcess, self).__init__(tester) 9 | 10 | def install_app(self): 11 | cmd = "adb -s %s install -r %s" % (self.tester.device.deviceid,DataProvider.niceapk) 12 | subprocess.call(cmd,shell=True) 13 | 14 | 15 | # if self.tester.is_element_exist('android:id/button2',5): 16 | # self.tester.find_element_by_id_and_tap('android:id/button2') 17 | # else: 18 | # pass 19 | 20 | def install_process(self): 21 | Log.logger.info(u"设备:%s 启动app并处理GPS弹窗" % self.tester.device.devicename) 22 | 23 | self.tester.find_element_by_id_and_tap('android:id/button2') 24 | try: 25 | 26 | while self.driver.is_app_installed("com.nice.main") == False: 27 | time.sleep(2) 28 | 29 | self.driver.launch_app() 30 | #self.tester.find_element_by_id_and_tap('android:id/button2') 31 | except Exception, e: 32 | traceback.print_exc() 33 | DriverManager.quit_driver(self.tester.device.deviceid) 34 | 35 | def login_success_process(self): 36 | try: 37 | Log.logger.info(u"设备:%s 登录成功后,处理各种自动弹窗" % self.tester.device.devicename) 38 | 39 | 40 | #授权通讯录弹框 41 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btn_ok') 42 | 43 | #授权联系人权限 44 | self.tester.find_element_by_id_and_tap('android:id/button1') 45 | 46 | except Exception, e: 47 | traceback.print_exc() 48 | DriverManager.quit_driver(self.tester.device.deviceid) 49 | 50 | def get_permission_process(self): 51 | Log.logger.info(u"设备:%s 获取相机及录音权限" % self.tester.device.devicename) 52 | try: 53 | #打开取景框 54 | self.tester.find_element_by_id_and_tap('com.nice.main:id/btnCamera') 55 | #self.tester.find_element_by_id_and_tap('com.nice.main:id/camera_tv') 56 | 57 | # 摄像头权限 58 | self.tester.find_element_by_id_and_tap('android:id/button1') 59 | 60 | # 录音权限 61 | self.tester.find_element_by_id_and_tap('android:id/button1') 62 | 63 | # 退出取景框,回到发现页面 64 | self.tester.find_element_by_id_and_tap('com.nice.main:id/titlebar_close') 65 | except Exception, e: 66 | traceback.print_exc() 67 | DriverManager.quit_driver(self.tester.device.deviceid) 68 | 69 | -------------------------------------------------------------------------------- /prepro/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/prepro/__init__.py -------------------------------------------------------------------------------- /res/README.md: -------------------------------------------------------------------------------- 1 | 发图的测试图片,在预处理中拷贝至设备 -------------------------------------------------------------------------------- /res/autotest/0806EF9802963A8512369373AE9E32EC.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/res/autotest/0806EF9802963A8512369373AE9E32EC.jpg -------------------------------------------------------------------------------- /res/autotest/098C1191F2E2A94756CD49A75ABE763B.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/res/autotest/098C1191F2E2A94756CD49A75ABE763B.jpg -------------------------------------------------------------------------------- /res/autotest/4CA22076BFAFA339C697CA0D0E1975B2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/res/autotest/4CA22076BFAFA339C697CA0D0E1975B2.jpg -------------------------------------------------------------------------------- /res/autotest/5343D94B01E7B43516E8841A87482454.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/res/autotest/5343D94B01E7B43516E8841A87482454.jpg -------------------------------------------------------------------------------- /res/autotest/5A70EE0CE05BDDCC290C8674C70C62C3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/res/autotest/5A70EE0CE05BDDCC290C8674C70C62C3.jpg -------------------------------------------------------------------------------- /res/autotest/7F0FFD3206D307DFA463D3E69A4690A2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/res/autotest/7F0FFD3206D307DFA463D3E69A4690A2.jpg -------------------------------------------------------------------------------- /res/autotest/B1758FB83C0834B7A4F490B1D8A34A12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/res/autotest/B1758FB83C0834B7A4F490B1D8A34A12.jpg -------------------------------------------------------------------------------- /res/autotest/CEDF4620EAA3DC538A1F9F964B40DE4C.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/res/autotest/CEDF4620EAA3DC538A1F9F964B40DE4C.jpg -------------------------------------------------------------------------------- /res/autotest/DCDF783DE47BF56CB43153DF81E90B62.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/res/autotest/DCDF783DE47BF56CB43153DF81E90B62.jpg -------------------------------------------------------------------------------- /run_mode_autotest.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | import requests 5 | 6 | def main(): 7 | url = 'http://127.0.0.1:8886/run?mode=autotest' 8 | response = requests.get(url) 9 | resjson = response.json() 10 | print resjson 11 | 12 | if __name__ == '__main__': 13 | main() 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /run_mode_monkey.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | import requests 5 | 6 | def main(): 7 | url = 'http://127.0.0.1:8886/run?mode=monkey' 8 | response = requests.get(url) 9 | resjson = response.json() 10 | print resjson 11 | 12 | if __name__ == '__main__': 13 | main() 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /run_server_appium.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from common.DeviceManager import * 5 | from common.Log import * 6 | from common.DataProvider import * 7 | import sys 8 | import os 9 | from Server.ServerManager import ServerManager 10 | 11 | def run(): 12 | # 初始化日志配置 13 | Log.create_log_file() 14 | 15 | Log.logger.info(u"加载设备及用户配置信息") 16 | DataProvider.init_data() 17 | 18 | Log.logger.info(u"获得ADB连接的设备") 19 | DeviceManager.get_connect_deviceid() 20 | 21 | if 0 == len(DeviceManager.connectdeviceid): 22 | Log.logger.info(u"没有连接的设备") 23 | sys.exit() 24 | else: 25 | Log.logger.info(u"当前已连接设备数: %s" % len(DeviceManager.connectdeviceid)) 26 | 27 | Log.logger.info(u"获得待测试的设备") 28 | DeviceManager.get_test_device() 29 | DeviceManager.get_server_test_device() 30 | 31 | servermanager = ServerManager() 32 | servermanager.list_devices() 33 | 34 | if len(DeviceManager.disconnectdevices) > 0: 35 | Log.logger.info(u"丢失备数: %s" % len(DeviceManager.disconnectdevices)) 36 | 37 | servermanager.list_disconnect_devices() 38 | servermanager.start_all_server() 39 | 40 | if __name__ == "__main__": 41 | run() -------------------------------------------------------------------------------- /run_server_http.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | from common.HttpServerHandler import * 5 | from SocketServer import ThreadingTCPServer 6 | from common.Log import * 7 | from Server.Server import * 8 | 9 | def kill_server(port): 10 | cmd = "lsof -i:%s|awk 'NR==2{print $2}'" % port 11 | pid = os.popen(cmd).read() 12 | cmd = "kill -9 %s" % pid 13 | os.popen(cmd).read() 14 | 15 | 16 | def start_server(): 17 | myport = 8886 18 | kill_server(myport) 19 | host = "127.0.0.1" 20 | port = myport 21 | addr = (host, port) 22 | Log.logger.debug('Start Server...') 23 | server = ThreadingTCPServer(addr, HttpServerHandler) 24 | server.serve_forever() 25 | 26 | 27 | def main(args=None): 28 | # 初始化日志配置 29 | Log.create_log_file() 30 | 31 | Log.logger.info(u"加载设备及用户配置信息") 32 | DataProvider.init_data() 33 | 34 | Log.logger.info(u"获得服务器上待测试的设备") 35 | DeviceManager.get_server_test_device() 36 | 37 | if len(DeviceManager.serverdevices) == 0: 38 | Log.logger.info(u"服务器上没有可以测试的设备") 39 | sys.exit() 40 | else: 41 | for deviceid, device in DeviceManager.serverdevices.items(): 42 | server = Server(device) 43 | server.list_connect_devices() 44 | 45 | start_server() 46 | 47 | if __name__ == '__main__': 48 | main() 49 | -------------------------------------------------------------------------------- /stopAll.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import os 3 | 4 | def stopAppium(): 5 | r = os.popen("ps -ef | grep appium") 6 | info = r.readlines() 7 | for line in info: # 按行遍历 8 | eachline = line.split() 9 | appium_pid = eachline[1] 10 | action = os.popen("kill " + appium_pid) 11 | print("kill" + appium_pid) 12 | 13 | def kill_server(port): 14 | cmd = "lsof -i:%s|awk 'NR==2{print $2}'" % port 15 | pid = os.popen(cmd).read() 16 | cmd = "kill -9 %s" % pid 17 | os.popen(cmd).read() 18 | 19 | stopAppium() 20 | kill_server(8886) 21 | 22 | -------------------------------------------------------------------------------- /testcase/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h080294/appium_python_android/452cc8d17363d8e46f98c59c91a128e7a5c60489/testcase/__init__.py -------------------------------------------------------------------------------- /testcase/test_just_try.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | 4 | import sys 5 | 6 | from common.ApkBase import ApkInfo 7 | from model.Teststeps import * 8 | 9 | sys.path.append('..') 10 | from common.BaseTestCase import * 11 | 12 | 13 | class test_longpress(BaseTestCase): 14 | 15 | @classmethod 16 | def setUpClass(cls): 17 | pass 18 | 19 | def setUp(self): 20 | pass 21 | 22 | def test_longpress_0(self): 23 | print "美颜" 24 | 25 | def test_longpress_1(self): 26 | time.sleep(5) 27 | self.tester.back_to_feed() 28 | print "返回feed" 29 | 30 | # 主动skip case 31 | def test_longpress_2(self): 32 | time.sleep(1) 33 | self.skipTest("hahha") 34 | 35 | # 主动fail case 36 | def test_longpress_3(self): 37 | time.sleep(1) 38 | self.fail("manual") 39 | 40 | def test_longpress_4(self): 41 | time.sleep(1) 42 | print "End 4 ~~~~~" 43 | 44 | def tearDown(self): 45 | pass 46 | 47 | # 请reset到feed页面 48 | @classmethod 49 | def tearDownClass(cls): 50 | pass 51 | -------------------------------------------------------------------------------- /testresult/README.md: -------------------------------------------------------------------------------- 1 | 测试结果存放 -------------------------------------------------------------------------------- /testresult/result.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /testresult/result.js: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------