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中的算数运算符的用法
May 13 Python
Python中title()方法的使用简介
May 20 Python
Python基于DES算法加密解密实例
Jun 03 Python
Python中规范定义命名空间的一些建议
Jun 04 Python
Python实现端口检测的方法
Jul 24 Python
python代码编写计算器小程序
Mar 30 Python
python制作朋友圈九宫格图片
Nov 03 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
解决Pytorch 加载训练好的模型 遇到的error问题
Jan 10 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 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
推荐25款php中非常有用的类库
2014/09/29 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
对联广告js flash激活
2006/10/19 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
在vue中使用防抖函数组件操作
2020/07/26 Javascript
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
保险公司晨会主持词
2014/03/22 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
党校学习心得体会范文
2014/09/09 职场文书
实习生矿工检讨书
2014/10/13 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
JavaScript的function函数详细介绍
2021/11/20 Javascript