Python PO设计模式的具体使用


Posted in Python onAugust 16, 2019

无规矩不成方圆。编写代码也是,如果没有大概的框架,管理代码将会是一件很头疼的事。

先看看笔者以前写的python脚本:

Python PO设计模式的具体使用

如果只有一个用例,这样看着好像挺整洁的。但是当用例越来越多后,如果元素定位发生了改变,那你将要在多个类、多个方法中,去寻找那个元素,然后一个一个修改,这将耗费很多时间。

引入PO设计模式后,管理代码将会很轻松。

什么是PO设计模式?

PO设计模式是一种业务流程与页面元素操作分离的模式;这意味着,当UI发生变化,元素定位发生变化时,只需要在一个地方修改即可。

下面是代码目录:

Python PO设计模式的具体使用

页面元素的定位、封装写到pages模块中;业务流程的操作写到test_case模块中;run_main是执行所有用例。

其它如读取配置文件等,可另外写到models模块中。

模块下的文件如下:

Python PO设计模式的具体使用Python PO设计模式的具体使用Python PO设计模式的具体使用

models模块

configfile.cfg:

#存储后台登录账号密码
[login]
username=admin
password=admin

#平台地址
[platform]
url = http://ip/admin

读取文件(readconfig.py):

import ConfigParser
import os

conf = ConfigParser.RawConfigParser()
#读取文件
conf.read(os.path.join(os.getcwd(),'models\\configfile.cfg'))
#账号、密码
username = conf.get("login", "username")
password = conf.get("login", "password")

#url
url = conf.get("platform", "url")

Myunit.py:

from selenium import webdriver
import unittest

from models import readconfig

class MyTest(unittest.TestCase):
  def setUp(self):
    self.driver = webdriver.Firefox()
    self.driver.get(readconfig.url)
    self.driver.maximize_window()
    time.sleep(4)
    #self.driver.implicitly_wait(2)
    
  def tearDown(self):
    self.driver.quit()

pages模块

pages下的登录页面loginpage.py

from selenium.webdriver.common.by import By
from pages.page import BasePage

class LoginPage(BasePage):
  '''
  用户登录页面
  '''
  #元素集
  #用户名
  username = (By.NAME,"userName")
  #密码
  passwd = (By.NAME,"password")
  
  #登录 按钮
  loginbtn = (By.XPATH,"//form[@id='frmLogin']/div[2]/footer/button")

  def input_username(self,text):
    print u"输入用户名:",text
    self.input_text(self.username, text)
    
  def input_passwd(self,text):
    print u"输入密码:",text
    self.input_text(self.passwd, text)
    
  def click_loginbtn(self):
    print u"点击 登录 按钮"
    self.click(self.loginbtn)

test_case模块

test_case下的登录操作logintest.py

from models.myunit import MyTest
from models import readconfig
from pages.loginpage import LoginPage
import unittest
import os

#所有test类都继承MyTest类;#每次执行xx_test方法时,会先执行MyTest中的setUp(),结束操作后再执行tearDown()
class LoginTest(MyTest):
  '''登录测试'''
  def test_login1(self):
    '''用户名和密码都为空'''
    try:
      
      loginpage = LoginPage(self.driver)
      loginpage.login_sys("", "")
      self.assertEqual(loginpage.none_user_hint(), u"请输入用户名")
      self.assertEqual(loginpage.none_passwd_hint(), u"请输入密码")
    except Exception as msg:
      print(u"异常原因:%s"%msg)
      self.driver.get_screenshot_as_file(os.path.join(readconfig.screen_path,'login1.png'))
      raise Exception("false")

run_main

run_main.py:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import unittestimport HTMLTestRunner
from models import readconfig 

report_path = readconfig.report_path

if __name__ == '__main__':
  #suite = unittest.TestSuite()
  #suite.addTest(TestAll('test_a'))
  now = time.strftime("%Y%m%d%H%M%S",time.localtime(time.time()))
  filename = report_path+now+'result.html'
  fp = open(filename,'wb')
  runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='REPORT',description='RESULT')
  discover = unittest.defaultTestLoader.discover("test_case",pattern="*test.py",top_level_dir=None)
  runner.run(discover)
  fp.close()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现批量解析邮件并下载附件
Jun 19 Python
python os.path模块常用方法实例详解
Sep 16 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
总结python中pass的作用
Feb 27 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
基于python实现高速视频传输程序
May 05 Python
python集合是否可变总结
Jun 20 Python
解决Pycharm后台indexing导致不能run的问题
Jun 27 Python
pandas对dataFrame中某一个列的数据进行处理的方法
Jul 08 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
Django设置Postgresql的操作
May 14 Python
详解python中的异常和文件读写
Jan 03 Python
python使用sessions模拟登录淘宝的方式
Aug 16 #Python
Django错误:TypeError at / 'bool' object is not callable解决
Aug 16 #Python
Python facenet进行人脸识别测试过程解析
Aug 16 #Python
Python Web框架之Django框架Model基础详解
Aug 16 #Python
pycharm配置git(图文教程)
Aug 16 #Python
Django如何实现上传图片功能
Aug 16 #Python
Python如何调用JS文件中的函数
Aug 16 #Python
You might like
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
HTML node相关的一些资料整理
2010/01/01 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
基于Python函数和变量名解析
2019/07/19 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
公司人力资源的自我评价
2014/01/02 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
有趣的广告词
2014/03/18 职场文书
学生自我评语大全
2014/04/18 职场文书
职业规划实施方案
2014/06/10 职场文书
工作收入证明模板
2014/10/10 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
预备党员个人总结
2015/02/14 职场文书
年度考核个人总结
2015/03/06 职场文书
《失物招领》教学反思
2016/02/20 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript