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()

把页面的元素放到一个一个类里

把里面的方法放方法等等放到一个函数里

优点:调用方便,维护好,改元素直接在你写的类里面维护,需要改方法直接在你的函数里面改方法

 

 

 

 

 

 

 

 

 
 
posted @ 2021-10-03 17:28  测试董先生  阅读(618)  评论(0编辑  收藏  举报