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

Stella981 等级 236 0 0
标签: common

从这篇文章我们将正式的进入正题,就是项目整合,在使用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源创计划”,欢迎正在阅读的你也加入,一起分享。

收藏
评论区

相关推荐

Undefined symbols for architecture armv7
The common causes for "Undefined symbols for architecture armv7" are: 1. You **import a header and do not link against the correct library**. This is common, especially for heade
ubuntu 16 LTS install QT creator
$ sudo apt-get install build-essential qtcreator qt5-default sudo vi /usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/linux.conf # QMAKE_LIBS_OPENGL =
10个常见的JavaScript BUG
**译者按:** 安全起见,在开发中我基本不用==。 * 原文: [10 COMMON JAVASCRIPT BUGS AND HOW TO AVOID THEM](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.dummies.com%2Fweb-design-developm
AngularJS5.0 (第五篇)
新建app-routing.module.ts import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule, Routes } from '@angular/router
Apache Common
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问  [http://jakarta.apache.org/commons/index.html](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fjakarta.apache.org%2F
Apache Hudi每周社区动态更新(2020.03.08
2020.03.08 ~ 2020.03.15 Apache Hudi社区更新,包括开发、特性、缺陷修复及测试方面内容。 ### 开发 \[Release\] 0.5.2-incubating rc1已经释出并且已经完成了dev@邮件列表的投票,有望最近正式释出新版本 \[1\] \[Metrics\] 关于将Hudi metrics相关的代码移动hu
Common Lisp 初学者快速入门指导
Common Lisp 初学者快速入门指导 ===================== V 0.90 目录 -- * [一、简单介绍](#1) * [1、本文目标](#1.1) * [2、适用读者](#1.2) * [3、迭代式学习](#1.3) * [4、本章内容小结](#1.4) *
Common Trace Format
Common Trace Format (CTF) Specification (v1.8.1) Mathieu Desnoyers, EfficiOS Inc. The goal of the present document is to specify a trace format that suits the
Debian8卸载Evolution安装Thunderbird
gnome3自带的evolution太难用了, 所以直接换thunderbird 首先卸载evolution sudo apt-get autoremove --purge evolution evolution-common 删除evolution时,有个evolution-data-server和evolution-data-server-comm
Discuz 中 ajaxget,ajaxpost 返回值没有显示到指定的区域中
1、需按下面的格式写 (需导入 require './source/class/class\_core.php';) include template('common/header\_ajax'); echo 'jack088'; include template('common/footer\_ajax'); 2、可能是 jQuery 与 Discuz
Elasticsearch Query DSL之全文检索(Full text queries)下篇
本文将继续介绍Elasticsearch Query DSL之全文检索(Full text queries)方式的后3种。 * common terms query * query\_string query * simple\_query\_string query 5、common terms query
FunTester八块八直播群
FunTester八块八直播群 =============== 由于[直播设备到货](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU4MTE2NDEyMQ%3D%3D%26mid%3D2247489909%26idx%3
MTK Android修改System分区
Z:\\rk3326\_p\_hq\_rf8637sa\\device\\rockchip\\common\\BoardConfig.mk #Calculate partition size from parameter.txt USE\_DEFAULT\_PARAMETER := $(shell test -f $(TARGET\_DEVICE\_D
Maven多模块下,扫描不到子模块mybatis xml文件的解决方法
有一个Maven项目, 里面有common模块和主模块, 其中common模块中有若干个mybatis的mapper和xml, 结果主模块调用其mapper时提示出错, 原因是找不到mapper对应的xml映射关系.          查资料得知, 主模块的application.yml里面,配置mybatis的mapper-locations时, 用的是
Springboot2.0集成 cassandra guava问题
Caused by: java.lang.NoClassDefFoundError: com/google/common/util/concurrent/FutureFallback at com.datastax.driver.core.GuavaCompatibility.selectImplementation(GuavaCompat