開(kāi)篇閑扯
生活就像一把吉他戒突,彈不響也要彈,bug就像測(cè)試的頭發(fā)唁奢,又濃又密!
生活中的瘋子宣布:“QQ測(cè)試項(xiàng)目正式開(kāi)始”
小白新秀
一件作品的開(kāi)始總是丑陋的
實(shí)現(xiàn)涣狗,QQ應(yīng)用底部導(dǎo)航控件之間的點(diǎn)擊跳轉(zhuǎn)
定位元素文件內(nèi)容
nav:
- android:id/tabs
- android.widget.RelativeLayout
- android.widget.FrameLayout
python 測(cè)試腳本代碼
from appium import webdriver
from time import sleep
import yaml
def read_yaml():
with open('duntil.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.mobileqq",
"appActivity": ".activity.SplashActivity",
"noReset": "true"
}
self.dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities=self.d)
sleep(10)
def change_nav(self):
a = self.dr.find_element_by_id(el[0]).find_elements_by_class_name(el[2])
for i in a:
i.click()
print(a)
def close(self):
self.dr.quit()
if __name__ == '__main__':
t = TestKe()
t.change_nav()
t.close()
舊事重提
昨天的問(wèn)題回答一下
為什么要加入睡眠時(shí)間?
appium自動(dòng)化測(cè)試吹截,核心之一是根據(jù)xml元素執(zhí)行模仿人的操作捧搞,xml文件的加載速度快于手機(jī)渲染UI布局頁(yè)面的速度筑累,雖然已經(jīng)在xml文件中找到定位元素果复,但是UI布局中該元素沒(méi)有被顯示材诽,那么該屬性的狀態(tài)依舊是不可見(jiàn)的狀態(tài)颤枪,所以很多做過(guò)自動(dòng)化測(cè)試的小伙伴經(jīng)常會(huì)遇到一個(gè)問(wèn)題汗捡,“xx元素找不到”,所以我們要在必要的代碼中加入等待時(shí)間
appium的三種等待方式
第一種:強(qiáng)制等待 --- time.sleep(浮點(diǎn)數(shù))
強(qiáng)制cup的線程停止xx秒,從而使元素在UI布局中加載出來(lái)
from time import sleep
sleep(2.5)
第二種:隱性等待 --- implicitly_wait()
設(shè)置最大等待時(shí)間畏纲,關(guān)鍵字參數(shù):time_to_wait=10扇住,超過(guò)最大等待時(shí)間后則會(huì)拋出異常
self.dr.implicitly_wait(time_to_wait=10)
第三種:安卓獨(dú)有 --- wait_activity():
在設(shè)置的時(shí)間內(nèi)沒(méi)間隔指定的時(shí)間掃描activity是否被找到,找到則執(zhí)行下面的代碼盗胀,超過(guò)最大等待時(shí)間則拋出異常
activity: 安卓活動(dòng)名艘蹋,tiemout:超時(shí)時(shí)間
self.dr.wait_activity(activity=".activity.SplashActivity'', timeout=10)
第四種:智能等待 --- WebDriverWait():在指定的時(shí)間內(nèi),默認(rèn)每隔一段時(shí)間檢測(cè)一次當(dāng)前頁(yè)面元素是否存在票灰,如果超過(guò)設(shè)置時(shí)間檢測(cè)不到則拋出異常女阀。
參數(shù)信息: driver:指的是webdriver.Remote()對(duì)象 timeout: 最長(zhǎng)超時(shí)時(shí)間,默認(rèn)以秒為單位 poll_frequency:間隔時(shí)間屑迂,默認(rèn)為 0.5 秒 ignored_exceptions - 超時(shí)后拋出的異常
from selenium import webdriver
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
locator = (By.ID, "android:id/tabs")
try:
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located((locator))
except:
print("元素未找到")
# 后期這里可以完善為日志
"""
selenium.webdriver.support.expected_conditions 類還包含以下方法
這兩個(gè)條件類驗(yàn)證title浸策,驗(yàn)證傳入的參數(shù)title是否等于或包含于driver.title
title_is
title_contains
presence_of_element_located # 判斷單一元素是否全部加載出來(lái)
presence_of_all_elements_located # 判斷多個(gè)元素全部加載出來(lái)
驗(yàn)證元素是否可見(jiàn),前兩個(gè)傳入?yún)?shù)是元組類型的locator屈糊,第三個(gè)傳入WebElement
第一個(gè)和第三個(gè)其實(shí)質(zhì)是一樣的
visibility_of_element_located
invisibility_of_element_located
visibility_of
判斷某段文本是否出現(xiàn)在某元素中的榛,一個(gè)判斷元素的text,一個(gè)判斷元素的value
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it # 判斷frame是否可切入
alert_is_present # 判斷是否有alert出現(xiàn) alert彈出框
element_to_be_clickable # 這個(gè)條件判斷元素是否可點(diǎn)擊
這四個(gè)條件判斷元素是否被選中逻锐,第一個(gè)條件傳入WebElement對(duì)象夫晌,第二個(gè)傳入locator元組
第三個(gè)傳入WebElement對(duì)象以及狀態(tài)雕薪,相等返回True,否則返回False
第四個(gè)傳入locator以及狀態(tài)晓淀,相等返回True所袁,否則返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
判斷一個(gè)元素是否仍在DOM中,傳入WebElement對(duì)象凶掰,可以判斷頁(yè)面是否刷新了
staleness_of
"""
最后一講
獲取控件中的值
首先你找到的元素中text屬性必須有值, 然后按照前幾篇將的定位方法進(jìn)行元素定位燥爷,再編寫腳本
def get_text(self):
b = self.dr.find_element_by_id('android:id/tabs').find_elements_by_class_name('android.widget.TextView')
for i in b:
print(i.text)
# 輸出結(jié)果是 消息 聯(lián)系人 看點(diǎn) 動(dòng)態(tài),一般這些東西用于斷言
明天聊
斷言
pytest
如何設(shè)計(jì)測(cè)試用例腳本
小記后語(yǔ)
愿明天的日出不像路燈那么昏黃懦窘,愿每個(gè)測(cè)試都能善待開(kāi)發(fā)的頭發(fā)前翎!阿門