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

从这篇文章我们将正式的进入正题,就是项目整合,在使用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的最佳实践,敬请期待!

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python+Selenium自动化篇

本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''