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多线程和队列操作实例
Jun 21 Python
python实现数据图表
Jul 29 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
python多个模块py文件的数据共享实例
Jan 11 Python
Python for循环与range函数的使用详解
Mar 23 Python
Django时区详解
Jul 24 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
Django Xadmin多对多字段过滤实例
Apr 07 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 Python
python脚本定时发送邮件
Dec 22 Python
python实现商品进销存管理系统
May 30 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+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
php调用mysql数据 dbclass类
2011/05/07 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
javascript 写类方式之三
2009/07/05 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
重构Python代码的六个实例
2020/11/25 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
应届生学校辅导员求职信
2013/11/07 职场文书
商务会议邀请函
2014/01/09 职场文书
大型活动组织方案
2014/05/10 职场文书
医学生自荐信范文
2015/03/05 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
Java Dubbo框架知识点梳理
2021/06/26 Java/Android