zoukankan      html  css  js  c++  java
  • 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()

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

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

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

     
     
  • 相关阅读:
    POJ 1006 ( 中国剩余定理 )
    HDU 2736 Surprising Strings
    STL----map 章节
    最短路问题
    [HAOI2007]反素数
    严格次小生成树[BJWC2010]
    P3320 [SDOI2015]寻宝游戏(LCA)
    [Violet]樱花/阶乘分解
    [HNOI2008]GT考试
    2012 年国家集训队互测 Tree
  • 原文地址:https://www.cnblogs.com/weilemeizi/p/15364570.html
Copyright © 2011-2022 走看看