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读取环境变量的方法和自定义类分享
Nov 22 Python
python按照多个字符对字符串进行分割的方法
Mar 17 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
django使用xadmin的全局配置详解
Nov 15 Python
python 的numpy库中的mean()函数用法介绍
Mar 03 Python
小结Python的反射机制
Sep 28 Python
Restful_framework视图组件代码实例解析
Nov 17 Python
python实现Thrift服务端的方法
Apr 20 Python
python常见的占位符总结及用法
Jul 02 Python
Python之matplotlib绘制饼图
Apr 13 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实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php实现点击可刷新验证码
2015/11/07 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
深入理解vue Render函数
2017/07/19 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
python使用htmllib分析网页内容的方法
2015/05/08 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
工商企业管理应届生求职信
2013/11/03 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
小班上学期个人总结
2015/02/12 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
九年级语文教学反思
2016/03/03 职场文书
python游戏开发Pygame框架
2022/04/22 Python