zoukankan      html  css  js  c++  java
  • appium+python自动化49-yaml管理定位元素

    前言

    如何高效管理定位元素,这个是很有学问的问题,也是面试必问的[以下纯属个人观点,勿喷!]

    • 有的人用xml管理页面定位元素,这种逼格略高,但是小编认为学习成本大,贼麻烦。
    • 有的人提到用excel管理页面定位元素,这种略显逼格,至少做到了数据分离,但是读取excel太慢,不够高效,还得在excel里面维护,忒麻烦。
    • 有的人说把定位元素放数据库管理,这种除了装逼,没觉得有多高效,当然有小伙伴提到接口测试数据量比较大的时候,这种方法还可以。
    • 有的人用pageobject模式,直接在page类写定位方法,虽然这种没直接把定位独立出来,但这种非常直观,也易于阅读

    那么有没有一种方法,既高效,直观,方便,又能装逼,还能迎合面试官口味呢?接下来就是要讲的这种yaml文件管理
    对yaml不了解的可以看我之前发的这篇python笔记14-读取yaml配置文件

    环境:
    python 3.6
    appium 1.8
    美团app
    yaml包安装:pip install pyyaml

    PageObject

    1.先回顾一下PageObject模式定位元素的写法,如下这种:

    class HomePage:
        '''dec: 首页'''
        
        # name: 城市选择
        city_loc = ("id", "com.sankuai.meituan:id/city_button")
        
        # name: 首页搜索
        home_loc = ("id", "com.sankuai.meituan:id/search_edit")
    
    

    yaml管理定位

    1.把定位方法放到yaml文件管理,美团app首页元素定位如下:

    HomePage:
      dec: 首页  
      # 作者:上海-悠悠 QQ交流群:330467341
      locators:
          -
            name: 城市选择
            type: id
            value: com.sankuai.meituan:id/city_button
          -
             name: 首页搜索
             type: id
             value: com.sankuai.meituan:id/search_edit
    
    

    2.app上[我的]菜单页定位

    MyPage:
      dec: 我的
      locators:
          -
            name: 我的
            type: accessibility_id
            value: 我的
          -
             name: 请点击登录
             type: id
             value: com.sankuai.meituan:id/user_name
    
    

    3.登录页面定位,这里我把登录的几个流程页合并到一起了

    ---
    LoginPage:
      dec: 登录页
      locators:
          -
            name: 微信登录
            type: id
            value: com.sankuai.meituan:id/passport_button_wechat
          -
             name: 手机号登录
             type: id
             value: com.sankuai.meituan:id/passport_button_meituan
    
          -
             name: 其它登录
             type: id
             value: com.sankuai.meituan:id/passport_button_other
    
          -
             name: QQ
             type: xpath
             value: //*[@text='QQ']
    
          -
             name: 微博
             type: xpath
             value: //*[@text='微博']
    
          -
             name: 账号密码
             type: xpath
             value: //*[@text='账号密码']
    
          -
             name: 输入账号
             type: id
             value: com.sankuai.meituan:id/edit_account
    
          -
             name: 输入密码
             type: id
             value: com.sankuai.meituan:id/edit_password
    
          -
             name: 登录按钮
             type: id
             value: com.sankuai.meituan:id/login_button
    

    遍历读取os.walk()

    1.把不同页面的元素放到对应的页面.yaml文件里,放到同一个目录下,方便一次性遍历读取

    • 在page总目录下,建一个pageelement的文件夹(这里是文件夹,里面不要有__init__.py文件),里面放页面元素的定位,不同的页面定义不同的namepage.yaml.
    • templetpage放一个自动生成用例的模板(这个模板是没后缀的文件),接下来会讲
    • tools.py 用于运行代码后自动生成pages.py脚本
    • pages.py 运行tools里面代码后生成的

    2.os.walk()遍历读取文件,之前有一篇专门讲过了python笔记4-遍历文件夹目录os.walk()

    # coding:utf-8
    import yaml
    import os
    # 当前脚本路径
    basepath = os.path.dirname(os.path.realpath(__file__))
    # yaml文件夹
    yamlPagesPath = os.path.join(basepath, "pageelement")
    
    def parseyaml():
        '''
        # 作者:上海-悠悠 QQ交流群:330467341
        遍历读取yaml文件
        '''
        pageElements = {}
        # 遍历读取yaml文件
        for fpath, dirname, fnames in os.walk(yamlPagesPath):
            for name in fnames:
                # yaml文件绝对路径
                yaml_file_path = os.path.join(fpath, name)
                # 排除一些非.yaml的文件
                if ".yaml" in str(yaml_file_path):
                    with open(yaml_file_path, 'r', encoding='utf-8') as f:
                        page = yaml.load(f)
                        pageElements.update(page)
        return pageElements
    
    if __name__ == "__main__":
        a = parseyaml()
        print(a)
        for i in a["HomePage"]['locators']:
            print(i)
    
    

    运行结果:

    下一篇讲通过templetpage模板自动生成pageobject模式的代码(用代码去写代码)
    上海-悠悠 QQ交流群:330467341

  • 相关阅读:
    音箱摆放
    SQL Server数据库开发的二十一条军规
    一年级程序员读《应用框架的设计与实现--.NET平台》
    JavaScript调用现成Word模板完成打印
    Asp.net下C#调用Word模版实例
    Android线程池
    Windows系统编程之异步I/O和完成端口 [北极星2003 看雪论坛]
    [转]异步IO、APC、IO完成端口、线程池与高性能服务器
    [转]Windows 内核(WRK)简介
    [转]IOCPSocket IO模型终结篇
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/9037558.html
Copyright © 2011-2022 走看看