公司項(xiàng)目結(jié)構(gòu)縮影
項(xiàng)目目錄下的結(jié)構(gòu)
.
├── __init__.py # python包的標(biāo)識
├── config # 基礎(chǔ)配置腳本
│ └── settings.py
├── data # 存放測試數(shù)據(jù)
│ └── __init__.py
├── doc # 測試項(xiàng)目相關(guān)文檔蘑志,以便于后期維護(hù)、新員工參閱
├── element # 存放定位元素
│ └── until.yaml # 定位元素yaml文件
├── logs # 測試腳本運(yùn)行生成的日志文件
├── src # pytest測試用例存放路徑
└── until # 存放一些公共函數(shù)活喊、腳本
└── __init__.py
7 directories, 5 files
執(zhí)行pytest后挽放,會(huì)自動(dòng)生成一個(gè)pytest相關(guān)文件,執(zhí)行allure會(huì)生成一個(gè)報(bào)告文件骡技,初次創(chuàng)建項(xiàng)目鸣个,因此這里沒有體現(xiàn)兩個(gè)該項(xiàng)目
實(shí)現(xiàn)騰訊課堂底部導(dǎo)航的跳轉(zhuǎn)
第一步: 定位相關(guān)元素
分析需要定位的元素
分析圖一可知,編號2中表示的是首頁這個(gè)控件在xml布局中的元素位置布朦,編號3中clickable屬性為true囤萤,說明該元素是可以被點(diǎn)擊的
前幾篇文章中有提到:“定位規(guī)則,優(yōu)先使用ID定位是趴,其次使用class定位涛舍,class一般情況下是不唯一的”,那么問題來了唆途,如何定位不唯一的元素
定位不唯一的元素的核心思想
尋找上級能唯一標(biāo)識自己的父級元素
實(shí)踐一下
分析圖二:
紅色方框內(nèi)是第一個(gè)被綠色框起來的是我們需要的定位元素富雅,該元素沒有ID,那么有人會(huì)說:“我會(huì)xpath肛搬,用xpath不就好了嗎没佑?”我只能告訴你,呵呵噠温赔!這個(gè)是安卓的原生控件蛤奢,你的xpath在這里用不鳥嘍!
這種情景只能乖乖滴使用層級定位方法解決問題
首先確認(rèn)上一級元素是否可以唯一让腹,不是唯一的繼續(xù)往上找远剩,根據(jù)我的經(jīng)驗(yàn)一般不超過三級,就可以找到唯一標(biāo)識自己的元素
如圖二:編號1的id是唯一的骇窍,編號2的class屬性不是唯一的瓜晤,編號3中的第一個(gè)綠色框是我們想要的元素
結(jié)論:“現(xiàn)根據(jù)id定位,再根據(jù)class定位腹纳,多個(gè)class屬性痢掠,沒辦法只能數(shù)數(shù)啦”
第二步:將定位元素保存到y(tǒng)aml文件中
自動(dòng)化測試的核心思想之一:頁面分離,“有時(shí)間再絮叨”
yaml文件內(nèi)容
nav:
- com.tencent.edu:id/fa
- android.widget.LinearLayout
讀取yaml文件的python函數(shù)代碼
import yaml
def read_yaml():
with open('/xxx.yaml', 'r') as fb:
print(yaml.load(fb)) #輸出的結(jié)果是{'nav': ['com.tencent.edu:id/fa', 'android.widget.LinearLayout']}
return yaml.load(fb) #字典的形式
read_yaml()
yaml非python內(nèi)置模塊驱犹,需要下載 命令: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) # 為什么要寫入休眠時(shí)間?
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為可點(diǎn)擊的元素對象淹辞,所以代碼這樣寫
for i in range(0, len(a), 2):
a[i].click()
if __name__ == '__main__':
t = TestKe()
t.change_nav()
生成測試報(bào)告
先賣個(gè)關(guān)子医舆,后期再說,本小記先到此
小記結(jié)語
為什么要添加休眠時(shí)間象缀?休眠時(shí)間有幾種方法蔬将?先讓自己的程序跑起來,再考慮優(yōu)化的問題央星,這就是一種進(jìn)步O蓟场!莉给!