Appium+python自动化(三十九)-Appium自动化测试框架综合实践 – 代码实现(超详解)
- 2019 年 11 月 14 日
- 筆記
简介
前边一直在分享testng的相关文章,看了点赞量和阅读数不是很高,宏哥猜测估计是大家确实是用不到或者不喜欢吧!不过宏哥经过一段时间的准备,appium的自动化测试框架完善的差不多了,那么接下来宏哥继续给小伙伴和童鞋们分享有关Appium自动化测试框架综合实践。想必小伙伴们有点等不及了吧!
driver配置封装
kyb_caps.yaml 配置表
主要是一些配置信息的封装。
参考代码
platformName: Android #模拟器 platformVersion: 5.1.1 deviceName: 127.0.0.1:62025 #mx4真机 #platformVersion: 5.1 #udid: 750BBKL22GDN #deviceName: MX4 appname: kaoyan3.1.0.apk noReset: False unicodeKeyboard: True resetKeyboard: True appPackage: com.tal.kaoyan appActivity: com.tal.kaoyan.ui.activity.SplashActivity ip: 127.0.0.1 port: 4723
desired_caps.py
主要是用来读取配置文件的信息的封装。
参考代码
# coding=utf-8 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 # 2.注释:包括记录创建时间,创建人,项目名称。 ''' Created on 2019-11-14 @author: 北京-宏哥 QQ交流群:707699217 Project:Appium自动化测试框架综合实践 - 代码实现 ''' # 3.导入模块 from appium import webdriver import yaml import logging import logging.config import os CON_LOG='../config/log.conf' logging.config.fileConfig(CON_LOG) logging=logging.getLogger() def appium_desired(): with open('../config/kyb_caps.yaml','r',encoding='utf-8') as file: data=yaml.load(file) desired_caps={} desired_caps['platformName']=data['platformName'] desired_caps['platformVersion']=data['platformVersion'] desired_caps['deviceName']=data['deviceName'] base_dir = os.path.dirname(os.path.dirname(__file__)) app_path = os.path.join(base_dir, 'app', data['appname']) desired_caps['app']=app_path desired_caps['appPackage']=data['appPackage'] desired_caps['appActivity']=data['appActivity'] desired_caps['noReset']=data['noReset'] desired_caps['unicodeKeyboard']=data['unicodeKeyboard'] desired_caps['resetKeyboard']=data['resetKeyboard'] logging.info('start app...') driver=webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',desired_caps) driver.implicitly_wait(8) return driver if __name__ == '__main__': appium_desired() # with open('../config/kyb_caps.yaml', 'r', encoding='utf-8') as file: # data = yaml.load(file) # # base_dir=os.path.dirname(os.path.dirname(__file__)) # print(os.path.dirname(__file__)) # print(base_dir) # # app_path=os.path.join(base_dir,'app',data['appname']) # print(app_path)
相对路径符号含义
- “.”表示当前目录
- “..” 表示当前目录的上一级目录。
- “./”表示当前目录下的某个文件或文件夹,视后面跟着的名字而定
- “../”表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定。
基类封装
baseView.py
主要是一些元素定位方法的封装。
参考代码
# coding=utf-8 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 # 2.注释:包括记录创建时间,创建人,项目名称。 ''' Created on 2019-11-14 @author: 北京-宏哥 QQ交流群:707699217 Project:Appium自动化测试框架综合实践 - 代码实现 ''' # 3.导入模块 class BaseView(object): def __init__(self,driver): self.driver=driver def find_element(self,*loc): return self.driver.find_element(*loc) def find_elements(self,*loc): return self.driver.find_elements(*loc) def get_window_size(self): return self.driver.get_window_size() def swipe(self,start_x, start_y, end_x, end_y, duration): return self.driver.swipe(start_x, start_y, end_x, end_y, duration)
common公共模块封装
公共方法封装 : common_fun.py
主要是一些公共方法的封装。
参考代码
# coding=utf-8 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 # 2.注释:包括记录创建时间,创建人,项目名称。 ''' Created on 2019-11-13 @author: 北京-宏哥 QQ交流群:707699217 Project:Appium自动化测试框架综合实践 - 代码实现 ''' # 3.导入模块 from kyb_testProject.baseView.baseView import BaseView from kyb_testProject.common.desired_caps import appium_desired from selenium.common.exceptions import NoSuchElementException import logging from selenium.webdriver.common.by import By import time,os import csv class Common(BaseView): cancelBtn=(By.ID,'android:id/button2') skipBtn=(By.ID,'com.tal.kaoyan:id/tv_skip') wemedia_cacel=(By.ID,'com.tal.kaoyan:id/view_wemedia_cacel') def check_cancelBtn(self): logging.info('==========check_cancelBtn=========') try: cancelBtn = self.driver.find_element(*self.cancelBtn) except NoSuchElementException: logging.info('no cancelBtn') else: cancelBtn.click() def check_skipBtn(self): logging.info('=========check skipBtn=============') try: skipBtn = self.driver.find_element(*self.skipBtn) except NoSuchElementException: logging.info('no skipBtn') else: skipBtn.click() def get_size(self): x = self.driver.get_window_size()['width'] y = self.driver.get_window_size()['height'] return x, y def swipeLeft(self): logging.info('swipeLeft') l = self.get_size() x1 = int(l[0] * 0.9) y1 = int(l[1] * 0.5) x2 = int(l[0] * 0.1) self.swipe(x1, y1, x2, y1, 1000) def getTime(self): self.now=time.strftime("%Y-%m-%d %H_%M_%S") return self.now def getScreenShot(self,module): time=self.getTime() image_file=os.path.dirname(os.path.dirname(__file__))+'/screenshots/%s_%s.png' %(module,time) logging.info('get %s screenshot' %module) self.driver.get_screenshot_as_file(image_file) def check_market_ad(self): logging.info('====check_market_ad====') try: element=self.driver.find_element(*self.wemedia_cacel) except NoSuchElementException: pass else: logging.info('close market ad') element.click() def get_csv_data(self,csv_file,line): logging.info('=====get_csv_data======') with open(csv_file,'r',encoding='utf-8-sig') as file: reader=csv.reader(file) for index,row in enumerate(reader,1): if index==line: return row if __name__ == '__main__': # driver=appium_desired() # com=Common(driver) # com.check_cancelBtn() # # com.check_skipBtn() # com.swipeLeft() # com.getScreenShot('startApp') list = ["这", "是", "一个", "测试", "数据"] # for i in range(len(list)): # print(i, list[i]) list1 = ["这", "是", "一个", "测试", "数据"] # for index, item in enumerate(list1): # print(index, item)
小结
好了,今天的分享就到这里。感谢您耐心的阅读!