ui自动化框架之fixture 参数化和python断言,po模式和中心库封装元素模式
学习目的
ui自动化框架之fixture 参数化和python断言,以及出测试报告发送钉钉,fixture失败重跑
脚本的代码定位优化
断言使用?????????assert 布尔值表达式 字符串短语 上抛异常为假才打印
比较重要的pytest的执行结果???
第一种
.成功
标准 所有的断言全部成功
运行过程中未发生异常
第二种
F失败
断言存在失败 只有有失败就是失败
第三种
E error
发生错误 发生异常
第四种
skip
前置脚本 fixture发生错误的提示
断言在用例中实战
失败要在上面写 ,要在开始写 ,下面写成功 失败一个会断
最好包装下解决失败后断言的错误
三个测试用例能共用一个断言嘛
解决断言失败不会退出,状态会重置 ,用例之前不影响 ???
check=Checkpoint() 创建这个检查点对象干嘛的
封装assert关键字
这里面包含,断言的封装 try的使用 assert断言的使用 面向对象的设计
#将所有断言封装
class Checkpoint:
def __init__(self):
self.flag=0#成员变量
def equal(self,a,b,msg=None):
try:
assert a==b
if msg:
print(msg)
except AssertionError:
print(f'断言失败:预期结果[a=b],实际结果:a={a},b={b}')
self.flag+=1
def __del__(self):#上面对象不用了自动执行这个末尾执行
#自动回收这是个高级的玩法
if self.flag>0:
assert False,'由于检查点错误,用例失败'
else:
print('用例成功')
check=Checkpoint()
check.equal(0,0,'0=0成功')
check.equal(1,2,'1=2成功')
check.equal(3,3,'1=2成功')
如何把你封装好的类移动到测试用例里面去呢???????这个是登录的用例怎么实践
如何对lotaion和driver方法去封装????????????
面试问ui自动化分层
最底层:seliuem api
上面层:页面元素管理(登录按钮)
元素定位器(包含方法)
最上面(登录流程,搜索流程等等) 这些是固定的
用一个文件,把所有的元素定位信息和别名写进去,并且写上别名,通过别名获取元素定位方式
一旦改了后我改文件就行,只要别名不改就行
这个就叫中心对象库 QTP差不多,每个公司用存储的文件格式不一样 (数据库,xml csv )
文件只要包含三个就行,元素定位方式,别名,定位内容 有的是四个多一个页面
写的时候写页面名字加元素 ,提取出来写在文件里
文件位置一般放在项目目录单独
以百度为例子就行实战 用例文件
对象库文件
封装元素方法的文件 文件名字 locator
from selenium import webdriver
import time
import csv
class Locator:
def __init__(self):
self.driver = webdriver.Chrome()
def element(self, page, name):
with open('../对象库.csv', 'r', encoding='utf-8') as f:
for i in csv.reader(f):
if page == i[0] and name == i[1]:
key = i[2]
value = i[3]
break
else:
raise Exception(f"对象未在对象库定义:{page} {name}")
if key == 'id':
try:
return self.driver.find_element_by_id(value)
except:
raise Exception(f"未找到指定元素,定位信息:by {key}, {value}")
elif key == 'name':
try:
return self.driver.find_element_by_name(value)
except:
raise Exception(f"未找到指定元素,定位信息:by {key}, {value}")
elif key == 'class':
try:
return self.driver.find_element_by_class_name(value)
except:
raise Exception(f"未找到指定元素,定位信息:by {key}, {value}")
elif key == 'link_text':
try:
return self.driver.find_element_by_link_text(value)
except:
raise Exception(f"未找到指定元素,定位信息:by {key}, {value}")
elif key == 'xpath':
try:
return self.driver.find_element_by_xpath(value)
except:
raise Exception(f"未找到指定元素,定位信息:by {key}, {value}")
def elements(self, key, value):
if key == 'xpath':
return self.driver.find_elements_by_xpath(value)
elif key == 'class':
return self.driver.find_elements_by_class_name(value)
def 点击(self, page, name):
self.element(page, name).click()
def 输入(self, page, name, text):
self.element(page, name).send_keys(text)
def 跳转(self, url):
self.driver.get(url)
def 等待(self, s):
time.sleep(s)
def 获取文本值(self, key, value):
return self.element(key, value).text
def 获取多个文本值(self, key, value):
texts = []
element_list = self.elements(key, value)
for e in element_list:
texts.append(e.text)
return texts
def 获取价格(self, key, value):
texts = []
element_list = self.elements(key, value)
for e in element_list:
texts.append(int(e.text[1:-3]))
return texts
@property
def 关闭(self):
self.driver.close()
另外一种是把封装到ccntest文件里
另外一种设计是po模式 ,面试经常问???
什么叫po page就是页面配置 o就是元素 object对象
页面对象设计模式
解决元素管理,元素定位问题
思想就是维护好一个一个登录,加入购物车一个一个类等等
标准po模式文件
class LoginPage:
username = ('id', 'email')
password = ('name', 'password')
btn = ('class name', 'btn')
def __init__(self, driver):
self.driver = driver
def login(self):
self.driver.get("http://8.141.52.231/shop/index.php?con=simple&act=login")
self.driver.find_element(self.username[0], self.username[1]).send_keys("admin@admin.com")
self.driver.find_element(self.password[0], self.password[1]).send_keys("111111")
self.driver.find_element(self.btn[0], self.btn[1]).click()
怎么调用上面的登录用例呢???????
def test_login01():
driver = webdriver.Chrome()
LoginPage(driver).login()
把页面的元素放到一个一个类里
把里面的方法放方法等等放到一个函数里
优点:调用方便,维护好,改元素直接在你写的类里面维护,需要改方法直接在你的函数里面改方法