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基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
Python创建模块及模块导入的方法
May 27 Python
python使用xslt提取网页数据的方法
Feb 23 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
详解Python绘图Turtle库
Oct 12 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
Python 字典中的所有方法及用法
Jun 10 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
anaconda python3.8安装后降级
Jun 11 Python
python异步的ASGI与Fast Api实现
Jul 16 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桌面中心(二) 数据库写入
2007/03/11 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
jquery 经典动画菜单效果代码
2010/01/26 Javascript
jquery 笔记 事件
2011/11/02 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
python实现图片批量剪切示例
2014/03/25 Python
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
python实现一组典型数据格式转换
2018/12/15 Python
Pycharm以root权限运行脚本的方法
2019/01/19 Python
在Python中使用Neo4j的方法
2019/03/14 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
Python实现FLV视频拼接功能
2020/01/21 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
艺术学院毕业生自我评价
2014/03/02 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
2015年度企业工作总结
2015/05/21 职场文书
vue实现登陆页面开发实践
2022/05/30 Vue.js