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程序的执行原理
Apr 11 Python
Python实现快速排序和插入排序算法及自定义排序的示例
Feb 16 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
Python绘图Matplotlib之坐标轴及刻度总结
Jun 28 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
详解django中Template语言
Feb 22 Python
如何从csv文件构建Tensorflow的数据集
Sep 21 Python
python collections模块的使用
Oct 16 Python
pandas中DataFrame重置索引的几种方法
May 24 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 $_FILES函数详解
2011/03/09 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
JS字符串函数扩展代码
2011/09/13 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
学习Bootstrap组件之下拉菜单
2015/07/28 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
深入解析nodejs HTTP服务
2017/07/25 NodeJs
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
使用Python和Scribus创建一个RGB立方体的方法
2019/07/17 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
J2EE面试题大全
2016/08/06 面试题
幼师自荐信范文
2013/10/06 职场文书
保洁主管岗位职责
2013/11/20 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
python实现三次密码验证的示例
2021/04/29 Python
Python并发编程实例教程之线程的玩法
2021/06/20 Python
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis