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 29 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
Python编程之序列操作实例详解
Jul 22 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
Python3爬虫学习入门教程
Dec 11 Python
python使用response.read()接收json数据的实例
Dec 19 Python
python使用Plotly绘图工具绘制柱状图
Apr 01 Python
python 初始化一个定长的数组实例
Dec 02 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
Python基于yaml文件配置logging日志过程解析
Jun 23 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
python编写爬虫小程序
2015/05/14 Python
Python实现建立SSH连接的方法
2015/06/03 Python
CSS3绘制圆角矩形的简单示例
2015/09/28 HTML / CSS
全球在线商店:BerryLook
2019/04/14 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
校园门卫岗位职责
2013/12/09 职场文书
银行职员思想汇报
2013/12/31 职场文书
最新个人职业生涯规划书
2014/01/22 职场文书
购房意向书范本
2014/04/01 职场文书
继承公证书样本
2014/04/04 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
爱心捐款感谢信
2015/01/20 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
学生检讨书范文
2019/06/24 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
python基础之模块的导入
2021/10/24 Python