Appium python 框架
来源:互联网 发布:名校就读 知乎 编辑:程序博客网 时间:2024/06/05 08:59
转载地址:https://testerhome.com/topics/3460
希望给点意见和建议,毕竟周围没有人可以交流。。。
前言
嘿嘿,第一次发帖有点小激动。
接触appium也有一个多月了,自己根据以前做selenium的经验(其实只有一年不到!!!)搭建了框架,希望大家给点意见啊!!!毕竟我身边没有可以和我交流的!!!万分感谢
流程
1.打开appium server
2.获取当前手机的device Name 和 安卓版本号,打开driver
3.运行case
4.生成报告
5.关闭driver
6.关闭appium server
结构
具体说说run.py
整个程序是从这个模块开始运行的,也是花了我最长时间的地方。下面上代码
# ========================================================# Summary :run# Author :tong shan# Create Date :2015-10-09# Amend History :# Amended by :# ========================================================import readConfigreadConfigLocal = readConfig.ReadConfig()import unittestfrom testSet.common.DRIVER import myDriverimport testSet.common.Log as Logimport osfrom time import sleepfrom selenium.common.exceptions import WebDriverExceptionimport threadingmylock = threading.RLock()log = Log.myLog.getLog()# ========================================================# Summary :myServer# Author :tong shan# Create Date :2015-10-10# Amend History :# Amended by :# ========================================================class myServer(threading.Thread): def __init__(self): global appiumPath threading.Thread.__init__(self) self.appiumPath = readConfigLocal.getConfigValue("appiumPath") def run(self): log.outputLogFile("start appium server") rootDirectory = self.appiumPath[:2] startCMD = "node node_modules\\appium\\bin\\appium.js" #cd root directory ;cd appiuu path; start server os.system(rootDirectory+"&"+"cd "+self.appiumPath+"&"+startCMD)# ========================================================# Summary :Alltest# Author :tong shan# Create Date :2015-10-10# Amend History :# Amended by :# ========================================================class Alltest(threading.Thread): def __init__(self): threading.Thread.__init__(self) global casePath, caseListLpath, caseList, suiteList, appiumPath self.caseListPath = readConfig.logDir+"\\caseList.txt" self.casePath = readConfig.logDir+"\\testSet\\" self.caseList = [] self.suiteList = [] self.appiumPath = readConfigLocal.getConfigValue("appiumPath")# =================================================================# Function Name : driverOn# Function : open the driver# Input Parameters: -# Return Value : -# ================================================================= def driverOn(self): myDriver.GetDriver()# =================================================================# Function Name : driverOff# Function : colse the driver# Input Parameters: -# Return Value : -# ================================================================= def driverOff(self): myDriver.GetDriver().quit()# =================================================================# Function Name : setCaseList# Function : read caseList.txt and set caseList# Input Parameters: -# Return Value : -# ================================================================= def setCaseList(self): print(self.caseListPath) fp = open(self.caseListPath) for data in fp.readlines(): sData = str(data) if sData != '' and not sData.startswith("#"): self.caseList.append(sData)# =================================================================# Function Name : createSuite# Function : get testCase in caseList# Input Parameters: -# Return Value : testSuite# ================================================================= def createSuite(self): self.setCaseList() testSuite = unittest.TestSuite() if len(self.caseList) > 0: for caseName in self.caseList: discover = unittest.defaultTestLoader.discover(self.casePath, pattern=caseName+'.py', top_level_dir=None) self.suiteList.append(discover) if len(self.suiteList) > 0: for test_suite in self.suiteList: for casename in test_suite: testSuite.addTest(casename) else: return None return testSuite# =================================================================# Function Name : runTest# Function : run test# Input Parameters: -# Return Value : -# ================================================================= def run(self): try: while not isStartServer(): mylock.acquire() sleep(1) log.outputLogFile("wait 1s to start appium server") mylock.release() else: log.outputLogFile("start appium server success") suit = self.createSuite() if suit != None: log.outputLogFile("open Driver") self.driverOn() log.outputLogFile("Start to test") unittest.TextTestRunner(verbosity=2).run(suit) log.outputLogFile("end to test") log.outputLogFile("close to Driver") self.driverOff() else: log.outputLogFile("Have no test to run") except Exception as ex: log.outputError(myDriver.GetDriver(), str(ex))def isStartServer(): try: driver = myDriver.GetDriver() if driver == None: return False else: return True except WebDriverException: raiseif __name__ == '__main__': thread1 = myServer() thread2 = Alltest() thread2.start() thread1.start() while thread2.is_alive(): sleep(10)#"allTest is alive,sleep10" else: #kill myServer os.system('taskkill /f /im node.exe') log.outputLogFile("stop appium server")
思路
刚接触的时候发现每次都要手动打开appium 服务,然后再运行代码,想着是不是太麻烦了?就想试着可不可做成一步?
这一想,就费了我好多功夫。
1.打开appium server
开始的时候,连如何用命令行打开服务都不会,在群里问了一圈(感谢回答问题的大大们!!!),然后自己又琢磨了一下,搞定了,可是!!!用os.system(),居然阻塞进程,最后还是问了群里的大大解决(再次感谢!!!!)。
2.如何判断server是否被成功开启?
这个问题我想了很久,现在我解决了,但是解决方法我不太满意,希望有大大可以给我一个好点的方法或者思路(跪谢!!)
目前做法:判断是否可以返回一个正常的driver对象
def isStartServer(): try: driver = myDriver.GetDriver() if driver == None: return False else: return True except WebDriverException: raise
3.关闭appium server
目前的做法是强制杀死,还是不太满意,不知道以后会不会有什么不可预见的问题,希望有大大可以给我一个好点的方法或者思路(跪谢!!)
if __name__ == '__main__': thread1 = myServer() thread2 = Alltest() thread2.start() thread1.start() while thread2.is_alive(): sleep(10)#"allTest is alive,sleep10" else: #kill myServer os.system('taskkill /f /im node.exe') log.outputLogFile("stop appium server")
其他模块
1.common.py 共同方法,主要指封装了一些方法,供其他模块使用。
2.DRIVER.py获取driver,这里是做成了一个单例模式,run.py中打开,关闭,其他模块调用。
3.Log.py中有2个类log和myLog,同样也把myLog做成了一个单例模式
4.myPhone.py主要使用了adb命令来识别和获取手机参数
5.readConfig.py是读取配置文件
有点遗憾的地方
1.目前异常机制还不够完善,也怪我学艺不精
2.线程是先学的,线程安全之类也没有考虑,目前做到的仅仅是可以用了
3.测试数据参数化还没有实现(这个还要再研究)
4.重要的话说3遍:没有人交流!!!
没有人交流!!!
没有人交流!!!
希望大家在看完后,多多题意见
最后附上源码地址:https://github.com/tongshan1/appium_python
鼓掌
在第2点中,判断appium是否开启,我使用的是http get 这个url: http://127.0.0.1:4723/wd/hub/status ,可以获取到appium的状态,如果在执行中,还可以得到正在执行的手机的udid等信息。
第3点钟,杀进程没关系,不放心可以在案例的最后 delete session。
第一点根据你提供的方法我写出来了
def isStartServer(): response = None url = baseUrl+"/status" try: response = urllib.request.urlopen(url, timeout=5) if str(response.getcode()).startswith("2"): print(response.getcode()) return True else: return False except URLError: return False finally: if response: response.close()
第二点
我发现在case执行结束后有这么一句log
info: <-- DELETE /wd/hub/session/ebfae3a8-b604-47c1-bb58-17cf02b28b57 200 977.879 ms - 76 {"status":0,"value":null,"sessionId":"ebfae3a8-b604-47c1-bb58-17cf02b28b57"}
是不是意味着我不需要在delete session了呢?
- Appium python 框架
- Appium python 框架
- Android环境搭建Appium测试框架 Python
- appium-python
- Appium Python behave 自动化测试框架搭建(1) - 安装环境
- Appium Python behave 自动化测试框架搭建(3) - Environment.py
- appium框架之bootstrap
- appium框架之bootstrap
- appium框架之bootstrap
- appium框架之bootstrap
- APPIUM 框架简述
- Appium移动自动化框架
- iOS+APPIUM+Python部署
- appium+python实例
- Appium Python 输入中文
- Appium Python API
- Appium Python API 中文版
- Appium Python API
- 开源插件ACTable已经打包放到Maven中央仓库啦!
- 解决机器人成品的研发和生产周期过长的尴尬现象
- Go -v 显示版本号和编译时间示例
- vue 中 echarts 的简单使用
- JS作用域
- Appium python 框架
- 用node.js实现多文件上传并携带进度条的demo
- P4-CM-08k070
- H20安装
- [bigdata-122] js的prototype
- BZOJ 2733 [HNOI2012]永无乡 可持久化线段树合并
- RTL-SDR第一课
- 【问题解决】网页加载百度地图加载不出来
- Error #2044 (flex Security)