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自动连接ssh的方法
Mar 07 Python
Python json模块使用实例
Apr 11 Python
python实用代码片段收集贴
Jun 03 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
python实现图书管理系统
Mar 12 Python
Python定义二叉树及4种遍历方法实例详解
Jul 05 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
Nov 14 Python
程序员写Python时的5个坏习惯,你有几条?
Nov 26 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
python 用所有标点符号分隔句子的示例
Jul 15 Python
Python 中如何写注释
Aug 28 Python
python 中的jieba分词库
Nov 23 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
PHP面向对象程序设计之接口用法
2014/08/20 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
python多线程与多进程及其区别详解
2019/08/08 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
2014年中班元旦活动方案
2014/02/14 职场文书
开学典礼策划方案
2014/05/28 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
高温慰问简报
2015/07/21 职场文书
职工宿舍管理制度
2015/08/05 职场文书
商务宴会祝酒词
2015/08/11 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
深入理解python协程
2021/06/15 Python