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