应用腾讯课堂测试小样

2019-07-26  本文已影响0人  流鼻涕的绿恐龙

公司项目结构缩影

项目目录下的结构

.
├── __init__.py  # python包的标识
├── config   # 基础配置脚本
│   └── settings.py 
├── data  # 存放测试数据
│   └── __init__.py
├── doc  # 测试项目相关文档,以便于后期维护、新员工参阅
├── element  # 存放定位元素
│   └── until.yaml  # 定位元素yaml文件
├── logs  # 测试脚本运行生成的日志文件
├── src  # pytest测试用例存放路径
└── until  # 存放一些公共函数、脚本
    └── __init__.py

7 directories, 5 files

执行pytest后,会自动生成一个pytest相关文件,执行allure会生成一个报告文件,初次创建项目,因此这里没有体现两个该项目

实现腾讯课堂底部导航的跳转

第一步: 定位相关元素

分析需要定位的元素

图一.png

分析图一可知,编号2中表示的是首页这个控件在xml布局中的元素位置,编号3中clickable属性为true,说明该元素是可以被点击的

前几篇文章中有提到:“定位规则,优先使用ID定位,其次使用class定位,class一般情况下是不唯一的”,那么问题来了,如何定位不唯一的元素

定位不唯一的元素的核心思想

寻找上级能唯一标识自己的父级元素

实践一下

图二.png
分析图二:
红色方框内是第一个被绿色框起来的是我们需要的定位元素,该元素没有ID,那么有人会说:“我会xpath,用xpath不就好了吗?”我只能告诉你,呵呵哒!这个是安卓的原生控件,你的xpath在这里用不鸟喽!
这种情景只能乖乖滴使用层级定位方法解决问题
首先确认上一级元素是否可以唯一,不是唯一的继续往上找,根据我的经验一般不超过三级,就可以找到唯一标识自己的元素
如图二:编号1的id是唯一的,编号2的class属性不是唯一的,编号3中的第一个绿色框是我们想要的元素
结论:“现根据id定位,再根据class定位,多个class属性,没办法只能数数啦”

第二步:将定位元素保存到yaml文件中

自动化测试的核心思想之一:页面分离,“有时间再絮叨”
yaml文件内容

nav: 
 - com.tencent.edu:id/fa
 - android.widget.LinearLayout

读取yaml文件的python函数代码

import yaml
def read_yaml():
    with open('/xxx.yaml', 'r') as fb:
        print(yaml.load(fb))  #输出的结果是{'nav': ['com.tencent.edu:id/fa', 'android.widget.LinearLayout']}  
        
        return yaml.load(fb)  #字典的形式

read_yaml()

yaml非python内置模块,需要下载 命令:pip install PyYAML

第三步:编写功能逻辑代码

from appium import webdriver
from time import sleep
import yaml


def read_yaml():
    with open('xxx.yaml', 'r') as fb:
        return yaml.load(fb)


el = read_yaml()['nav']


class TestKe(object):
    def __init__(self):
        self.d = {
            "device": "android",
            "platformName": "Android",
            "platformVersion": "9",
            "deviceName": "46HDU19314003325",
            "appPackage": "com.tencent.edu",
            "appActivity": ".module.SplashActivity",
            "noReset": "true"
        }
        self.dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities=self.d)
        sleep(2.5)  # 为什么要写入休眠时间?

    def change_nav(self):
        a = self.dr.find_element_by_id(el[0]).find_element_by_class_name(el[1]).find_elements_by_class_name(el[1])
        # 0、2、4、6为可点击的元素对象,所以代码这样写
        for i in range(0, len(a), 2):
            a[i].click()


if __name__ == '__main__':
    t = TestKe()
    t.change_nav()

生成测试报告

先卖个关子,后期再说,本小记先到此

小记结语

为什么要添加休眠时间?休眠时间有几种方法?先让自己的程序跑起来,再考虑优化的问题,这就是一种进步!!!

上一篇下一篇

猜你喜欢

热点阅读