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中列表(list)操作方法汇总
Aug 18 Python
Python中__new__与__init__方法的区别详解
May 04 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
浅谈python数据类型及类型转换
Dec 18 Python
python爬取m3u8连接的视频
Feb 28 Python
Django中使用session保持用户登陆连接的例子
Aug 06 Python
python关于变量名的基础知识点
Mar 03 Python
Python接口测试结果集实现封装比较
May 01 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
10行Python代码实现Web自动化管控的示例代码
Aug 14 Python
Django数据库迁移常见使用方法
Nov 12 Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 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/09/15 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
PHP实现八皇后算法
2019/05/06 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
美国创意之家:BulbHead
2017/07/12 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
机电专业个人自荐信格式模板
2013/09/23 职场文书
总裁秘书岗位职责
2013/12/04 职场文书
厂区绿化方案
2014/05/08 职场文书
林肯就职演讲稿
2014/05/19 职场文书