前言:

设计执行格式,封装PO模型工厂,实现PO模型脱离代码,一套代码执行所有项目的UI自动化,让UI自动化框架脱离高成本、低效率时代,将用例的重用性贯彻到极致,让烦人的PO模型变得无所谓,让一个测试小白都能编写并实现自动化

知识储备前提:熟悉python语言理论与实际运用,熟悉selenium库与自动化测试环境配置。对PO模型很熟悉。

《Python+Selenium WebUI自动化框架 -- 统一入口自动化》:Python+Selenium WebUI自动化框架 -- 统一入口自动化_魂尾ac的博客-CSDN博客

这一篇算是我所有文章最长的一篇了,也是最核心的了,掌握了,写一套自动化框架,执行所有项目UI自动化,不需要再动代码。

1、读取用例及设计用例格式

#[{"a": [{"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}]},{"a": [5, 3, 2]}, {"a": [10, 4, 6]}]

用例一般使用excel通过一定逻辑写出来,然后通过代码读取后转换成一个格式化的数据集。

格式正解:

一整个excel文件存放在列表里

列表里有很多字典,每一个字典是一个sheet页,字典的key是sheet页标题,字典的value是sheet页里的内容

sheet页的内容又是一个列表,里面有着很多字典,每一个字典代表着一条用例

读取用例格式化的代码如下

def readallcase(self):     此方法遍历excel文件中的所有sheet页

def readcase(self, sh):    此方法遍历sheet页中所有的row,将其组合成一条条用例case

class ReadCase(object):def __init__(self):self.sw = openpyxl.load_workbook(file)print(self.sw)def openxlsx(self, file):"""打开文件:param dir::return:"""# self.sw = openpyxl.load_workbook(file)#[{"a": [{"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}, {"A": 2}]},{"a": [5, 3, 2]}, {"a": [10, 4, 6]}]def readallcase(self):"""取所有sheet页:return:list,返回sheet页里的数据"""sheet_list = []for sh in self.sw:if 'common' != sh.title.split('_')[0] and 'common' != sh.title.split('-')[0] and sh.title[0] is not '#' :isOK, result = self.readcase(sh)if isOK:sheet_list.append(result)if sheet_list is None:return False, '用例集是空的,请检查用例'return True, sheet_listdef readcase(self, sh):"""组合sheet页的数据:param sh::return: list,返回组合数据"""if sh is None:print('sheet页为空')datas = list(sh.rows)if datas == []:return False, '用例[' + sh.title + ']里面是空的'title = [i.value for i in datas[0]]rows = []sh_dict = {}for i in datas[1:]:data = [v.value for v in i]row = dict(zip(title, data))try:if str(row['id'])[0] is not '#':row['sheet'] = sh.titlerows.append(row)except KeyError:raise erows.append(row)sh_dict[sh.title] = rowsreturn True, sh_dict

2、 实现不需要代码的PO模型

重点来了,这里应该会很难,首先说一个概念,“公共用例”,这应该是自动化界大多数人知道的。

公共用例的定义:可以是几个公共控件的操作,也可以是个登录首页,也可以是个中间过度页面,凡是多次用到的用例都可以写到公共用例里去,方便调用。

用了这种“公共用例” 代替PO模型。最开始我是在华为的自动化框架里见识这个概念,很强大,所以用自己的代码实现了并模仿了这个。

首先,我们设计一种用例规则,

‘调用用例’  四个字为可以调用执行其他sheet页用例的命令,然后设计能被调用sheet页标题为common_或common-开头 ,回顾上面的设计用例格式的代码 def readallcase(self):方法里有一行代码

if 'common' != sh.title.split('_')[0] and 'common' != sh.title.split('-')[0] and sh.title[0] is not '#' :

对,这行代码是在读取所有可执行用例时规避掉公共用例,因为公共用例是要在所有可执行用例里调用的,公共用例不能自己单独运行,

实现代码如下:

我们在工厂类里面定义两个方法

#初始化执行用例 def init_execute_case(self): 里面的内容:

一、读取了excel里所有可执行用例

二、调用用初始化公共用例

#初始化公共用例 def init_common_case(self, cases): 里面的内容:

一、判断是否有‘调用用例’命令,有则取公共用例合并成可执行用例

二、递归取公共用例里是否有‘调用用例’命令,有则继续取公共合并成可执行用例

注意:公共用例不能调用自已,递归死循环

from common.getconf import Config
from common.getcase import ReadCase
from basefactory.browseroperator import BrowserOperator
from basefactory.webdriveroperator import WebdriverOperatorclass Factory(object):#初始化公共用例def init_common_case(self, cases):""":param kwargs::return:"""cases_len = len(cases)index = 0for case in cases:if case['keyword'] == '调用用例':xlsx = ReadCase()try:case_name = case['locator']except KeyError:return False, '调用用例没提供用例名,请检查用例'#取公共用例isOK, result = xlsx.get_common_case(case_name)if isOK and type([]) == type(result):#递归检查公共用例里是否存在调用用例isOK, result_1 = self.init_common_case(result)     elif not isOK:return isOK, resultlist_rows = result[case_name]cases[index: index+1] = list_rows    #将公共用例插入到执行用例中去index += 1if cases_len == index:return False, ''return True, cases#初始化执行用例def init_execute_case(self):print("----------初始化用例----------")xlsx = ReadCase()isOK, result = xlsx.readallcase()if not isOK:print(result)print("----------结束执行----------")exit()all_cases = resultexcu_cases = []for cases_dict in all_cases:for key, cases in cases_dict.items():isOK, result = self.init_common_case(cases)    #将取的执行用例,去初始化一下公共用例   if isOK:cases_dict[key] = resultelse:cases_dict[key] = casesexcu_cases.append(cases_dict)print("----------初始化用例完成----------")return excu_cases

然后在写好两个工厂方法后,我们还少了一个方法,那就是读取用例里的类里没有读取公共用例的方法,所以这里补上

这个方法在class ReadCase(object):读取用例的类下面,请回顾 1、读取用例及设计用例格式

    def get_common_case(self, case_name):"""得到公共用例:param case_name::return:"""try:sh = self.sw.get_sheet_by_name(case_name)except KeyError:return False, '未找到公共用例[' + case_name + '],请检查用例'except DeprecationWarning:passreturn self.readcase(sh)

到这里这个框架所有的中心思想都出来了,希望大家能看懂。暂时没看懂的,拿着我这三篇文章,将里面的代码组合在一起,也能整出这个框架来。让我们一起学吧,谢谢

哦,把执行代码也放出来,因为是基础,所以不讲解了,基于unittest + ddt,详细请看下面代码:

用例执行类

import unittest
from common.factory import Factory
from library.ddt import ddt, data@ddt
class Test_caserun(unittest.TestCase):fac = Factory()excu_cases = fac.init_execute_case()@data(*excu_cases)def test_run(self, acases):for key, cases in acases.items():for case in cases:isOK, result = self.fac.execute_keyword(keyword=case['keyword'],type=case['type'],locator=case['locator'],index=case['index'],input=case['input'],check=case['check'],time=case['time'])if isOK:print(result)else:raise Exception(result)

执行入口类

import os
import unittest
from library.HTMLTestRunnerNew import HTMLTestRunner
from common.getfiledir import CASEDIR, REPORTDIRclass Test_run(object):def __init__(self):self.suit = unittest.TestSuite()self.load = unittest.TestLoader()self.suit.addTest(self.load.discover(CASEDIR))self.runner = HTMLTestRunner(stream=open(os.path.join(REPORTDIR, 'report.html'), 'wb'),title='魂尾自动化工厂',description='唯a饭木领',tester='HUNWEI')def excute(self):self.runner.run(self.suit)if __name__=="__main__":test_run = Test_run()test_run.excute()

整个框架目录也奉上,这是最近写着玩的,所以发送邮件,打印日志什么的扩展,可以在common目录下自行添加

getconf.py与getfiledir.py中的一个是读配置文件,一个是读本框架所有目录,

最后看执行结果:

替代PO模型:一切公用的执行用例都可以放到以common开头的sheet页里,其他非common用例可以使用  调用用例 方法,在locator输入用例名可调用。细节处理(common用例可以调用common用例,但不可以调用自己,程序会死)

excel用例逻辑:

打开baidu,  等待页面出现,然后调用用例:common_input,  common_input的用例在第二张图,执行结果看第三图、四图

执行用例:

common公共用例:

执行页面:

执行步骤打印:

结语:等手头上有空闲时间,自己再完善此框架,持续更新

Python+Selenium WebUI自动化框架 -- 实现特殊PO模型相关推荐

  1. Python+Selenium 网页自动化 exe 程序编程实现(最全避坑指南)

    前言 在我的日常工作中,经常需要在内网(不连接互联网)的网页版办公系统中进行抓取网页数据.修改表单等大量重复性的操作.我就想是否可以编写出自动化的工具,将这些日常琐碎的操作变得轻松而高效.虽然本人非计 ...

  2. 记录Python selenium制作自动化农民世界脚本第一天

    @记录Python selenium制作自动化农民世界脚本第一天 第一步,实现自动化登录农民世界 直接上代码 class Wish(object):# def __init__(self):def g ...

  3. python+selenium实现自动化连接校园网

    python+selenium实现自动化连接校园网(资源下载链接在总结) 校园网的自动连接 在学校里面,我经常会用到校园WiFi.我个人使用的是办移动套餐送的wifi套餐,因此,我连接的WiFi是NJ ...

  4. 已解决python selenium模块自动化操作谷歌浏览器点击元素失效问题解决(亲测有效)

    已解决python selenium模块自动化操作浏览器点击元素,抛出异常selenium.common.exceptions.ElementClickInterceptedException: Me ...

  5. python的web自动化框架实例_Selenium基于Python web自动化测试框架 -- PO

    关于selenium测试框架首先想到的就是PO模型,简单说下PO模型 PO模型的概念和理解: PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息.相关操作都放到一个类中,从而使 ...

  6. python+selenium+unittest自动化测试框架

    前言 关于自动化测试的介绍,网上已有很多资料,这里不再赘述,UI自动化测试是自动化测试的一种,也是测试金字塔最上面的一层,selenium是应用于web的自动化测试工具,支持多平台.多浏览器.多语言来 ...

  7. Selenium4.0+Python手撸自动化框架系列之 Web元素等待方式介绍 与 封装

    目录 前言 三种等待 一.线程等待 二.隐性等待 三.显性等待 封装 一.参数设计 二.函数名设计 三.封装代码设计 前言 web自动化测试,常常因为硬件配制,浏览器,网速等因素导致网页加载速度过慢, ...

  8. python+selenium爬虫自动化批量下载文件

    一.项目需求 在一个业务网站有可以一个个打开有相关内容的文本,需要逐个保存为TXT,数据量是以千为单位,人工操作会麻木到崩溃. 二.解决方案 目前的基础办法就是使用python+selenium自动化 ...

  9. Python+selenium Web自动化持续更新

    保姆入门级Web自动化学习资料 前言 Web自动化环境搭建 软件准备 开始环境搭建 浏览器和驱动下载 谷歌浏览器驱动版本对应以及下载: edge浏览器驱动版本对应以及下载: ie浏览器驱动官方地址: ...

最新文章

  1. Android中的线程处理
  2. 2021-01-20 Python编程特殊小技巧汇集
  3. C#中FileStream的对比以及使用方法
  4. 岗位推荐 | 微软AI Research Group招聘自然语言处理AI算法研究实习生
  5. 蓝牙芯片排行_7月TWS 全球品牌出货量排行榜出炉
  6. 超人气光棍节!现在时间虽然不是2011年11月11日11点11分11秒11毫秒11微秒11纳秒11皮秒11飞秒11阿秒11渺秒11......
  7. Linux 命令(一) findgrep文件查找命令
  8. 使用layui遇到的一些问题及解决方案
  9. C/C++ 活动预处理器
  10. Visual Studio Code配置
  11. HDU3501——欧拉函数裸题
  12. route -n 详解
  13. R语言作图——Dumbbell plot(哑铃图)
  14. 【慕课网】JavaScript中函数和this
  15. 字节跳动+京东+美团+腾讯面试总结,附赠课程+题库
  16. Java期末大作业-工资系统平台(实验报告内附代码)
  17. vpu测试_联发科P30支持的VPU是什么?不知道就别说你懂科技了
  18. 微众银行Solidity智能合约库:区块链工程师的随身工具箱
  19. 如何有效实现软件的需求管理 - 7
  20. 1445. 苹果和桔子

热门文章

  1. 鸿蒙手机怎么截屏,华为手机竟有这么多花样截屏方式,很多人都不知道,你用过几种?...
  2. 2022-2027年中国康复机器人行业发展前景及投资战略咨询报告
  3. 荣誉丨国辰机器人荣获维科杯•OFweek 2021中国机器人行业年度优秀应用案例奖
  4. kafka第三次课!
  5. 共享经济发展风口传统广告转型共享广告
  6. 访问学者出国申请可以分为哪几类?
  7. PPT全文一次性更改英文和中文字体
  8. Java Swing布局管理器
  9. Java Swing面板布局之网格布局GridLayout
  10. seo外链发布之论坛外链