公司项目结构缩影
项目目录下的结构
.
├── __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()
生成测试报告
先卖个关子,后期再说,本小记先到此
小记结语
为什么要添加休眠时间?休眠时间有几种方法?先让自己的程序跑起来,再考虑优化的问题,这就是一种进步!!!
网友评论