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交流群:512200893
  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交流群:512200893
    遍历读取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模式的代码(用代码去写代码)

原文发布于微信公众号 - 从零开始学自动化测试(yoyoketang)

原文发表时间:2018-05-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

KindEditor开源富文本编辑框架XSS漏洞

0×01 前言 KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统...

4428
来自专栏IT大咖说

vSAN架构解析与6.7功能介绍

内容来源:2018 年 7 月 17 日,VMware大中华区原厂高级技术讲师史峻在“VMware直播分享 第二期”进行《vSAN架构解析与6.7功能介绍》演讲...

3143
来自专栏大前端开发

从编程小白到全栈开发:寻找代码中的问题

很少有人能一下子就写出完全没有问题的代码。工作良好的程序,都是经过一遍遍的反复测试运行、发现问题、剔除问题(也就是我们所说的找Bug和修Bug)过后的产物,经过...

1003
来自专栏大数据和云计算技术

常见Linux调优命令和工具

引言: 应同学的要求,分享些基础的知识。 没有比Linux更基础了,关键问题来了,你真的认真看了和转发了吗? O(∩_∩)O哈哈~ 要实现对Linux的调优,就...

8509
来自专栏源码之家

discuz x2.5如何彻底去掉路径中portal.php

3244
来自专栏月色的自留地

Mac电脑C语言开发的入门帖

3185
来自专栏一“技”之长

iOS10通知框架UserNotification理解与应用

        关于通知,无论与远程Push还是本地通知,以往的iOS系统暴漏给开发者的接口都是十分有限的,开发者只能对标题和内容进行简单的定义,至于UI展示和...

1542
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装和使用ArangoDB

ArangoDB是一个NoSQL数据库。它创建于2011年,当时已有许多NoSQL数据库,其目标是成为一个涵盖各种用例的综合数据库解决方案。

5310
来自专栏编程微刊

基于promise用于浏览器和node.js的http客户端的axios

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:

1262
来自专栏漫话前端

浏览器已原生支持 ES 模块,这对前端开发来说意味着什么?

还记得当初入门前端开发的时候写过的 Hello World 么?一开始我们先创建了一个 HTML 文件,在 <body> 标签里写上网页内容;后来需要学习页面交...

3757

扫码关注云+社区

领取腾讯云代金券