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和pyqt实现360的CLable控件
Feb 21 Python
在Python中操作文件之seek()方法的使用教程
May 24 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
深入浅出学习python装饰器
Sep 29 Python
python装饰器实例大详解
Oct 25 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
Python代码执行时间测量模块timeit用法解析
Jul 01 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 Python
python控制台打印log输出重复的解决方法
May 14 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编程效率的53个要点(经验小结)
2010/09/04 PHP
解析php中curl_multi的应用
2013/07/17 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
Django框架实现的简单分页功能示例
2018/12/04 Python
django主动抛出403异常的方法详解
2019/01/04 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
校园广播站开场白
2015/06/01 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL