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实现在IDLE中输入多行的方法
Apr 19 Python
Python使用numpy模块创建数组操作示例
Jun 20 Python
python 重命名轴索引的方法
Nov 10 Python
Django组件之cookie与session的使用方法
Jan 10 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
python实现查找所有程序的安装信息
Feb 18 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
Python turtle编写简单的球类小游戏
Mar 31 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 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 中的类
2006/10/09 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
网页图片延时加载的js代码
2010/04/22 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
利用Python实现图书超期提醒
2016/08/02 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
彻底理解Python list切片原理
2017/10/27 Python
TensorFlow实现模型评估
2018/09/07 Python
Python Numpy库datetime类型的处理详解
2019/07/13 Python
Python logging设置和logger解析
2019/08/28 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
django queryset相加和筛选教程
2020/05/18 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
python中xlutils库用法浅析
2020/12/29 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js