接上一篇完成配置文件的设置后,我们开始正式开始编写python自动化测试脚本:

基于对设计框架时的分析,主要的实现的功能时对移动端中对应场景通过代码自动完成指定的操作,首页以实现基本的操作的类作为基类,放置与baseView文件夹。

基类代码如下:

#coding=utf-8# 完成基类的封装
class BaseView(object):def __init__(self, driver):self.driver = driver#寻找元素def find_element(self, *args,**kwargs):return self.driver.find_element(*args, **kwargs)#寻找元素列表def find_elements(self, *args, **kwargs):return self.driver.find_elements(*args, **kwargs)#获取屏幕尺寸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文件夹下,包含了以下3个文件:

1.启动脚本:desire_caps.py

import json
from appium import webdriver
import os
import logging.configCON_LOG = r'../config/log.conf'
logging.config.fileConfig(CON_LOG)
logging = logging.getLogger()def appium_desired():with open("../config/desire_caps", "r") as file:data = json.load(file)desired_caps = {}# print(data['platformName'])desired_caps['platformName'] = data['platformName']desired_caps['deviceName'] = data['deviceName']desired_caps['deviceVersion'] = data['deviceVersion']BASE_DIR = os.path.dirname(os.path.dirname(__file__))App_Path = os.path.join(BASE_DIR, 'app', data['appName'])desired_caps['app'] = App_Pathdesired_caps['noReset'] = data['noReset']desired_caps['unicodeKeyboard'] = data['unicodeKeyboard']desired_caps['resetKeyboard'] = data['resetKeyboard']desired_caps['appPackage'] = data['appPackage']desired_caps['appActivity'] = data['appActivity']logging.info('start run app...')driver = webdriver.Remote("http://%s:%s/wd/hub" % (data['host'], data['port']), desired_caps)driver.implicitly_wait(5)return driverif __name__ == '__main__':appium_desired()

2.公用方法类:common_fun.py

from baseViews.baseView import BaseView
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
from common.desire_caps import *
import time
import os
import csv#完成公用的类及其方法
class Common(BaseView):def set_Btn(self, match, value):Btn = (match, value)return Btndef check_updateBtn(self):logging.info("===========check updateBtn=======")btn_name = 'android:id/button2'update_btn = self.set_Btn(By.ID, btn_name)try:element = self.find_element(update_btn[0], update_btn[1])except NoSuchElementException:logging.info("===not found update button====")else:logging.info("===check update button====")element.click()def check_skipBtn(self):logging.info('====check skipBtn====')btn_name = 'com.tal.kaoyan:id/tv_skip'btn = self.set_Btn(By.ID, btn_name)try:element = self.find_element(btn[0], btn[1])except NoSuchElementException:logging.info("===not found skip button====")else:logging.info("===check skip button====")element.click()def get_screenSize(self):'''获取屏幕尺寸:return:'''x = self.get_window_size()['width']y = self.get_window_size()['height']return (x, y)def swipeLeft(self):logging.info('swipeLeft')l = self.get_screenSize()y1 = int(l[1] * 0.5)x1 = int(l[0] * 0.95)x2 = int(l[0] * 0.25)self.swipe(x1, y1, x2, y1, 1000)def getTime(self):self.now = time.strftime("%Y-%m-%d %H_%M_%S")return self.nowdef 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=============')self.wemedia = self.set_Btn(By.ID, 'com.tal.kaoyan:id/view_wemedia_cacel')try:element = self.driver.find_element(*self.wemedia)except NoSuchElementException:passelse:logging.info('close market ad')element.click()def get_csv_data(self, csv_file, line):'''获取csv文件指定行的数据:param csv_file: csv文件路径:param line: 数据行数:return:'''BASE_DIR = os.path.dirname(os.path.dirname(__file__))csv_file_path = os.path.join(BASE_DIR, 'data', csv_file)with open(csv_file_path, 'r', encoding='utf-8-sig') as file:reader = csv.reader(file)for index, row in enumerate(reader, 1):if index == line:return rowif __name__ == '__main__':driver = appium_desired()com = Common(driver)com.check_updateBtn()com.check_skipBtn()com.swipeLeft()com.swipeLeft()com.getScreenShot('startapp')

3.测试用例公用类:myunit.py

import unittest
from common.desire_caps import *
from time import sleepclass StartEnd(unittest.TestCase):def setUp(self):logging.info('===setup====')self.driver = appium_desired()def tearDown(self):logging.info('====tearDown====')sleep(5)self.driver.close_app()

当完成基类以及公用类的封装,下一步我们继续实现业务逻辑的脚本

appium自动化测试框架系列之基类以及公共类的封装相关推荐

  1. Appium自动化框架从0到1之 公共方法的封装

    在写测试用例的时候,最常用的就是方法的调用, 我们在这里,把公共方法封装到一个文件中, 这样以后需要使用,直接调用这个方法就可以了. 直接上代码: common_func.py # -*- codin ...

  2. pythonappium自动化框架_Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)...

    简介 前边一直在分享testng的相关文章,看了点赞量和阅读数不是很高,宏哥猜测估计是大家确实是用不到或者不喜欢吧!不过宏哥经过一段时间的准备,appium的自动化测试框架完善的差不多了,那么接下来宏 ...

  3. Appium+python自动化(三十八) - Appium自动化测试框架综合实践 - 框架简介-助你冲击高薪,迎娶白富美(超详解)...

    简介 好久没有更新博客了,博友们是不是有点等不及了.不好意思啊,中秋节过后太忙了,这篇是好不容易抽点零碎时间写的.从这一篇开始小伙伴或者童鞋们,就跟随宏哥的脚步,一步步的从无到有,从0到1的搭建一个完 ...

  4. Appium自动化测试框架

    Appium自动化测试框架 环境搭建 adb 构成和原理 连接 包名,界面名 文件传输 获取APP启动时间 获取手机日志 安装和卸载APP 进入到安卓手机内部的Linux系统命令行 启动和停止adb服 ...

  5. Python Appium自动化测试框架 综合实践案例(中)

    Time will tell. 本篇章紧接上一篇继续来分享关于 Appium 自动化测试框架综合实践案例代码.框架所需要的代码实现都已基本完成. data数据封装 1.使用背景 在实际项目过程中,我们 ...

  6. Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)

    1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.到今天为止,大功即将告成:框架所需要的代码实现都基本完成. 2.data数据封装 2.1使用背景 在实际项目过程 ...

  7. python +appium实现原理_Appium+python自动化(四十)-Appium自动化测试框架综合实践 - 代码实现(超详解)...

    #coding=utf-8#1.先设置编码,utf-8可支持中英文,如上,通常放在第一行 #2.注释:包括记录建立时间,建立人,项目名称. '''Created on 2019-11-18 @auth ...

  8. python appium自动化测试框架unittest_Appium基于Python unittest自动化测试 自动化测试框架 -- PO并生成html测试报告...

    基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...

  9. Appium自动化测试框架的原理、安装以及使用

    appium是一个开源的移动端自动化测试框架,可以测试原生的.混合的以及移动端的web项目,appium是跨平台的,可以运行在osx.windows以及linux桌面系统上,用来测试ios.andro ...

最新文章

  1. 详细设计说明书读后感_明晚十点,和大家详细介绍这本版式设计新书!
  2. SAP HUM 如何查询一个HU号码是否被软分配给了某个销售订单 ?
  3. Nacos源码NacosAutoServiceRegistration
  4. ASP.NET 应用程序遭遇Server Application Unavailable问题的解决的方法
  5. nginx配置静态资源访问路径
  6. jsencrypt加密同一值返回不同密文_密码学原语如何应用?解析密文同态性的妙用...
  7. 键盘拆开重新安装步骤_机械键盘小白入门工具
  8. 在线客服代码,可以用
  9. Julia : DataFrame常见用法
  10. ApolloStudio高手之路(4):用Python以最轻便的方式进行金橙子激光打标板卡二次开发(以EzCad2为载体二次开发)
  11. html svg 编辑器
  12. Win10设置热点IP
  13. 亚马逊全站点、全类目产品爬取,支持批量品牌注册查询,独家技术防屏蔽节省大量选品分析时间,全自动无人值守运行
  14. 取消参考文献自动编号_参考文献的自动编号及引用
  15. 设计师都在用这几个免费素材网站,赶紧马住
  16. I.MX RT1176笔记(3)-- 双核启动和通信 MU
  17. 如何将android文件标题归中,Android复习题归纳总结
  18. 利用Python实现NBA球员分析绘制数据可视化图表
  19. Spark学习-DAY4
  20. Java 反编译工具的使用与对比分析

热门文章

  1. SVM中函数间隔和几何间隔的区别
  2. Python:使用pycorrector处理错字、纠正
  3. 携不符合安全标准充电宝禁止登机
  4. SSM框架整合---详细案例
  5. 如何解决架构与业务发展冲突?讯飞输入法Android架构演进
  6. 微信公众服务号,运营过程中如何更好的完善细节问题
  7. 婚纱摄影类小程序如何设计与制作
  8. ROS学习|SMACH状态机一(安装与初探)
  9. 索爱多功能广场舞蓝牙音箱怎么样啊?
  10. 两块钱买来的常数变易法