Python+appium+pytest自动化教程(八)

Stella981
• 阅读 479

从这篇文章我们将正式的进入正题,就是项目整合,在使用pytest+appium之前我们先进行selenium+unitest的使用,如下文:

pageObject是Selenium自动化测试项目的最佳设计模式之一,通过对界面的元素的封装,减少冗余代码,同时在后期维护中,若元素发生定位只需要页面调整封装元素的代码

重构思路

  • 将一些公共的内容抽出来

  • 元素定位方法和元素属性值与业务代码分离

  • 登录功能封装为一个独立的模块

  • 使用unittest进行综合管理

    config.ymlplatforName:AndriodplatformVersion:5.1.1deviceName:127.0.0.1appPackage:com.lg.appActivity:com.example.startActivityip:127.0.0.1#####################from appium import webDriverimport ymldef appium_desired():    file=open('config.yml','r') # r代表读    data=yaml.load(file)    logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG)    descried_caps={}    descried_caps['platformName']=data['platformName']    descried_caps['deviceName']=data['deviceName']    descried_caps['platformVersion']=data['platformVersion']    dedcried_caps['uuid']=''#真机中需要使用,这个是adb中列出的    dedcried_caps['noRest']=data['noRest'] #保留上次的    descried_caps['unicodeKeyboard']=data['unicodeKeyboard'] #设置后需要把输入法设置为本机的    descried_caps['resetKeyBoard']=data[]    descried_caps['app']=data[]''    descried_caps['appPackage']=data[]''    descried_caps['appActivity']=data[]''    driver=webdriver.Romote('http://127.0.0.1:4723',descried_caps)    return driverif name == '__ main__' appium_desired()

公共的封装的base.py

class BaseView(object):def _init_(self,driver):        self.driver=driverdef find_element(self,*loc)        return self.driver.find_element(*loc)

封装通用的公共类common.py继承baseView

import loggingclass Common(BaseView):    canselbtn=(By,ID,"android:id/button")def check_cancelBtn(self):        logging.info("========check_cancel=========")        try:            element =self.driver.find_element(*self.cancelBtn)        except NoSuchElementExcption:            logging.info("not found elments")        else:            logging.info("click_cancel")            element.click()def check_skipBtn(self,*loc)        logging.info("========check_cancel=========")        try:            element =self.driver.find_element(*self.skipBtn)        except NoSuchElementExcption:            logging.info("not found elments")        else:            logging.info("click_cancel")            element.click()if __name__ == '__main__':driver=apium_desired()com=Common(driver)com.click_updateBtn()com.click_skipBtn()

封装登录loginview

#导入common,appium_desrie,Commonclass LoginView(Common):    username_type=(By.ID,'')    passWord_type=(By,ID,'')    loginBtn=(By.ID,'')    def login_action(self,username.password)        self.check_cancelBtn()        self.check_skipBtn()        logging.info('=============login_action=============')        logging,info('username is:%s' %username )        self.driver.find_element(*.self.username_type).send_keys(username)        logging.info('password is:%s' %password)        self.driver.find_element(*.self.password_type).send_keys(password)        logging.info('click loginBtn')        self.driver.find_element(*.self.loginbtn).click()if __name__ == '__main__':    driver=appium_desired()    l=LoginView(driver)    l.login_action('用户名','密码')

unittest用例封装myunit.py

import unittestimport loggingimport appium_desiredclass StartEnd(unittest,TestCase):    def setup(self):        logging.info('=====setup====')        self.driver=appium_desired()    # 执行结束之后    def tearDown(self):        logging.info('=====setup====')        sleep(5)        self.driver.close_app()

用例封装test_login.py

class TestLogin(StartEnd):    def test_login_zxw2018(self):        logging.info('------test_login_zow2018------')        l=LoginView(self,driver)        l.login_action('自学','123')    def test_login_zxw2017(self):        logging.info('------test_login_zow2017------')        l=LoginView(self,driver)        l.login_action('账号2','密码2')    def test_login_error(self):        logging.info('------test_login_error------')        l=LoginView(self,driver)        l.login_action('自学','123')if __name__ == '__main__':    unitest,main()

到此其他的页面只需继承Common页面就可以使用,同时使用了前面我们学的一些知识,这样其不是很好,学以致用,这里面我只是写了大致的逻辑和思路,具体的封装还是需要和业务逻辑结合起来的。看是很简单的页面点击操作,如果进行分层来归纳,这样是不是更加的简洁明了,下篇将是appium+pytest的最佳实践,敬请期待!

Python+appium+pytest自动化教程(八)

本文分享自微信公众号 - 面向对象Coding(codingeverything)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Stella981 Stella981
2年前
RobotFramework自动化测试之元素定位
前言:最近在做基于RF框架的Web自动化测试,其中涉及到元素的定位,主要用到id、name、xpath、css四中定位方法,尤其后面的两种方法特别有效,可以解决大部分的定位问题。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
RF自动化测试之元素封装
自动化测试均需要遵循由点到面的规则,然而对于UI自动化,点是最容易发生变化的,如果使用硬链接,那么每次元素的修改都必须修改代码,这对于代码功底薄弱的测试工程师来说,是较为困难的,所以自动化测试需要对底层基本元素进行封装1、首先就是元素的获取方式我推荐使用CSV的文件格式对元素进行存储和维护,并给每个元素起个别名,这样之后元素维护只需要修改CSV表中具
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这