web自动化中的page object模式
一. 原理
将页面的元素定位和元素行为封装成一个page类,实现页面对象和测试用例分离
类的属性:元素定位
类的行为:元素的操作
测试用例:调用所需页面对象中的行为,组成测试用例
二. 好处
1. 当某个页面的元素发生变化,只需要修改该页面对象中的代码即可,测试用例不需要修改
2. 提高代码重用率,结构清晰,维护代码更容易
3. 测试用例发生变化时,不需要或者只需要修改少数页面对象代码即可
三. 分析
四. 优化—pytest
pytest:基于unittest之上的单元测试框架
1. 自动发现测试模块和测试方法
2. 断言使用assert + 表达式即可
3. 可以设置会话级、模块级、类级、函数级的fixtures
4. 有丰富的插件库,目前在300个以上
安装命令
pip install pytest
安装html报告的插件
pip install pytest-html
pytest插件地址
http://plugincompat.herokuapp.com/
pytest—mark
对测试用例打标签,在运行测试用例的时候,可根据标签名来过滤要运行的用例
使用方法:
在测试用例/测试类前面加上:@pytest.mark.标记名
示例:
@pytest.mark.smoke
pytest—收集测试用例
pytest收集测试用例的规则:
1. 默认从当前目录中搜集测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索
2. 搜索规则:
1) 符合命令规则test_*.py 或者 *_test.py 的文件
2) 以test_开头的函数名
3) 以Test开头的测试类 (没有__init__函数) 当中,以test_开头的函数
pytest—用例运行方式
指定测试模块:pytest test_mod.py
指定测试目录:pytest testing/
通过关键字表达式过滤执行:
pytest -k *MyClass and not method*
这条命令会匹配文件名、类名、方法名匹配表达式的用例
通过节点id来运行测试:
节点id的组成: py模块名::类名::函数名 或者 py模块名::函数名
示例:pytest test_xxx.py::TestXXX::func_XXX
通过标记表达式执行
pytest -m smoke
这条命令会执行被装饰器 @pytest.mark.smoke 装饰的所有测试用例
获取用例执行性能数据
五. 优化—pytest—html
需要安装pytest-html插件
pytest可以生成多种样式的结果:
1. 生成JunitXML格式的测试报告: --junitxml=path
2. 生成result log格式的测试报告: --resultlog=report\log.txt
3. 生成Html格式的测试报告: --html=report\test_one_func.html
只运行打了smoke标记的测试用例
- import pytest
- from Common.conf_dir import htmlreport_dir
- import time
- cur_Time = time.strftime("%Y-%m-%d_%H-%M-%S")
- pytest.main(["-m", "smoke",
- "--junitxml", "{0}/WEB_AutoTest_{1}.xml".format(htmlreport_dir, cur_Time),
- "--html", "{0}/WEB_AutoTest_{1}.html".format(htmlreport_dir, cur_Time)])
运行全部的测试用例
- import pytest
- from Common.conf_dir import htmlreport_dir
- import time
- cur_Time = time.strftime("%Y-%m-%d_%H-%M-%S")
- pytest.main(["--junitxml", "{0}/WEB_AutoTest_{1}.xml".format(htmlreport_dir, cur_Time),
- "--html", "{0}/WEB_AutoTest_{1}.html".format(htmlreport_dir, cur_Time)])
六. pytest—定义fixture
fixture:即测试用例执行的环境准备和清理,在unittest中即指setup()、teardown()
fixture主要的目的:是为了提供一种可靠和可重复的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步也是冗余
定义fixture:
把一个函数定义为fixture很简单,在函数声明之前加上@pytest.fixture,表示此函数为测试环境数据的准备和清理
那么,在一个fixture内部如何区分环境准备、环境清理呢?
在函数内使用yield关键字
yield关键字以后的代码,就是环境清理的代码,即在测试用例执行完成之后会执行的代码
fixture返回值
fixture定义之后的使用
七. pytest—调用fixture
调用fixture的三种方式:
1. 在测试用例中直接调用它:
将fixtures的函数名字作为测试用例的参数
如果fixture有返回值,那么测试用例中的fixture函数名字就接收返回值
示例:
def test_tttt(self, myfixture): #fixture函数名字作为参数传入
myfixture.find_element_by_xpath("XXX") #函数名代表了fixture的返回值,即driver
2. 用fixture装饰器调用fixture
在测试用例/测试类前面加上@pytest.mark.usefixtures("fixture函数名字")
ps:定义conftest.py文件,在此文件中可定义多个fixture,pytest会自动搜索此文件
3. 用autos调用fixture
当定义fixture时,有一个参数是autouse,默认设置为False
当默认为False,就可以选择用上面两中方式来试用fixture
当设置为True时,在一个session内所有的test都会自动调用这个fixture
权限大,责任也大,所以用该功能时也要谨慎小心
八. pytest—conftest.py
定义公共的fixture,多个测试类中都可以调用
pytest提供了conftest.py文件,可以将fixture定义在此文件中
运行测试用例时,不需要去导入这个文件,会自动去查找conftest.py文件,然后去找到对应的fixture
九. pytest—定义fixture
fixture的参数中,有scope作用域
function:每个test都运行,默认是function的scope,即unittest中的setUp和tearDown
class:每个class的所有test只运行一次。即unittest中的setUpClass和tearDownClass
module:每个module的所有test只运行一次
session:每个session只运行一次(如连接数据库操作)
fixture中设置返回值
有的时候,我们在测试环境初始化时,会对资源进行处理后,在测试用例中要使用这个资源
yield 返回值
示例:
@pytest.fixture #默认scope为function
def myfixture():
driver = webdriver.Chrome()
yield driver #将driver作为返回值,在测试用例中需要使用driver
driver.close() #测试用例执行完成之后,要执行的清理操作
driver.quit() #测试用例执行完成之后,要执行的清理操作
web自动化中的page object模式的更多相关文章
- 转 Page Object模式
Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通 ...
- UI自动化测试的Page Object模式
在UI级的自动化测试框架中,当页面样式改变或者页面元素属性改变,那么代码也要随之进行修改,如何做到高效快速的修改代码来适应这些改变呢,这个时候可以引入Page Object模式,也是页面对象设计模式. ...
- 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式
一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...
- selenium page object模式
页面对象模式将测试代码和被测试页面的元素及操作进行分离,以降低页面元素的变化对测试代码的影响.每个被测试的页面都会被定义一个类,类中会定位元素和操作. 如果不使用page object模式,则相同的操 ...
- python+selenium自动化软件测试(第7章):Page Object模式
什么是Page ObjectModel模式Page Objects是selenium的一种测试设计模式,主要将每个页面看作是一个class.class的内容主要包括属性和方法,属性不难理解,就是这个页 ...
- 浅析selenium的page object模式
selenium目前比较流行的设计模式就是page object,那么到底什么是page object呢,简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好 ...
- Page Object 模式编写UiAutomator脚本
在我们学习Page Object Model之前,我们先了解一下Page Object Model(以下简称POM). 为什么要POM 用UiAutomator启动UI自动化测试不是一件困难的任务.你 ...
- 使用page object模式抓取几个主要城市的pm2.5并从小到大排序后写入txt文档
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
- python selenium-8 Page Object模式
封装空间操作为一个接口使用,而不是直接在页面中查找 from selenium import webdriver from selenium.webdriver.common.by import By ...
随机推荐
- tornado web应用程序结构
tornado web 应用程序通常包含一个或者多个RequestHandler 子类,一个Application 对象来为每个控制器路由到达的请求和一个mian()函数 import tornado ...
- 系列文章(一):探究电信诈骗的关键问题与应对策略——By Me
导读:伴随着互联网与移动网的融合,移动互联网变得更加开放.与此同时,伴随着新型的移动互联网服务模式的出现,移动互联网的安全问题也出现了新的形式及特点. 如今,移动互联网遭受到的攻击已严重影响了人们的隐 ...
- (2.2)学习笔记之mysql基础操作(登录及账户权限设置)
本系列学习笔记主要讲如下几个方面: 本文笔记[三:mysql登录][四:账户权限设置][五:mysql数据库安全配置] 三.mysql登录 常用登录方式如下: 四.账户权限设置 (4.1)查看用户表, ...
- 部署Node.js的应用
原创:作者 mashihua 最近Node.js很火,让很多的前端看到了可以直接从前端写到后端的希望.但是每次部署一个Node.js的应用却让前端苦恼不已.每次登陆服务器,用自己不熟悉的方式从版本控制 ...
- 单文件快速体验使用react输出hello_world
看了下react官方的hello world教程, 感觉对新手很不友好.codepen虽然好用, 但是封装太多东西, 看起来 太抽象. 还是喜欢像学习jQuery那样, 直接在单文件中引入必要的js文 ...
- cdoj1329卿学姐与魔法
地址:http://acm.uestc.edu.cn/#/problem/show/1329 题目: 卿学姐与魔法 Time Limit: 1200/800MS (Java/Others) M ...
- memcached单点
一.Repcached (memcached同步补丁) 下载地址:http://sourceforge.net/projects/repcached/files/repcached/2.2.1-1.2 ...
- Linux中read命令的用法—(6/30)
read命令是一个非常重要的bash命令,用于从键盘或者表中输入中文本,并且可以和用户进行交互:该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开.在read命令后面,如果没有指定变量名 ...
- 手机调取摄像头问题(getUserMedia)
先说坏消息,苹果机没法玩这个!!! 而且,必须拥有 https 的安全协议!!! 而安卓机想完成这个功能倒是很 easy 的,看一眼代码 主要传入三个参数,配置对象,成功,失败 var mediaOp ...
- 【Java】流与文件(端口 & 文件读写对象)
概述: 1.input和output是相对于内存而言的.输入(input)就是写入到内存里,输出(output)就是把内存里的东西写到外面. 2.操作内存里的东西非常便利,要么声明变量,要么new对象 ...