1.使用appium框架
由于appium比較熟悉,想著使用appium框架來統(tǒng)計時長
使用adb來啟動app,啟動后計時,然后循環(huán)查找首頁特定的某個元素蜕提,一旦找到停止計時,然后計算時差來得出app的啟動時長
理想很豐滿靶端,現(xiàn)實很骨感谎势,通過代碼實現(xiàn)來看,查找元素是需要時間的
long start = System.currentTimeMillis();
//啟動后查找首頁元素杨名,找到后計算時間
long end=0;
int i=0;
while (true) {
try {
WebElement ll = driver.findElement(By.xpath("http://android.widget.TextView[@text='立即清理']"));
// if (ll.get(1).getText().equals("立即清理")) {
end = System.currentTimeMillis();
System.out.println(ll.getText()+"::"+i);
// ll.click();
break;
// }
}catch (Exception e) {
System.out.println((System.currentTimeMillis()-start)+":::"+i);
}
i++;
}
代碼執(zhí)行結(jié)果來看脏榆,當在首頁進行findelement的時候,由于首頁控件很多台谍,導(dǎo)致查找變慢找到元素就需要1400ms须喂,而app的熱啟動在幾百毫秒內(nèi),根本無法滿足需求……
由此看來趁蕊,此方式無法實現(xiàn)坞生,主要原因是查找元素需要耗時,耗時超過了啟動時間介衔,這還統(tǒng)計個球……
2.暫時沒有想到其他方式,好像只能是通過錄屏的方式來實現(xiàn)了
最早接觸的錄屏方式是通過手動錄屏骂因,就是拿個手機或攝像頭炎咖,將app啟動的全程錄下來,然后對視頻進行分幀,找到起始點乘盼,計算總時長升熊。啟動時長又分冷啟動和熱啟動,而且還需要多次的數(shù)據(jù)來求平均绸栅,所以手動錄制和分幀的工作有些麻煩级野。
暫時制定的規(guī)則是冷啟動和熱啟動各5次,來求平均值
將手動改為自動粹胯,是自動化測試的最終目的
新接觸到的采集工具蓖柔,是通過腳本的方式來實現(xiàn)的
1.使用adb start命令來啟動app
2.使用screenrecord命令來開始錄屏
3.將screenrecord錄制時間設(shè)為5s或6s,錄屏結(jié)束后风纠,拷貝到電腦本地
4.使用FFmpeg框架况鸣,來對視頻進行每秒60的分幀(分幀后視頻的幀數(shù)會很大,影響后邊圖片對比的速度竹观,個人覺得沒必要進行分幀)
5.分幀后生成一個新的視頻镐捧,使用stagesepx框架來進行圖片對比,框架基于opencv進行圖片對比臭增,添加了分組算法懂酱,將視頻分為動態(tài)組和靜態(tài)組,app啟動的視頻誊抛,最開始一組肯定是在桌面靜態(tài)的列牺,當app打開時是靜態(tài)的,查找靜態(tài)組的end時間芍锚,即作為啟動app的開始時間昔园,然后查找對比成功的靜態(tài)組,某個組存在該圖片并炮,則說明app進入了首頁并且渲染完畢了(因為是靜態(tài)了)默刚,此為終點
cutter = VideoCutter()
res = cutter.cut(video)#將視頻進行分幀
print('開始判斷狀態(tài):')
stable, unstable = res.get_range()#獲取到靜止和動態(tài)的所有分組
print('simmmmmm:', stable)
for item in stable[:]:#遍歷靜止的所有分組
# print(item.start_time, '-->', item.end_time, flush=True)
print("ssssssss:::", item)
# 檢查最后一個階段中是否包含圖片 template.png
res = item.contain_image(template)
# print(res, flush=True)
# eg. {'target_point': [550, 915], 'target_sim': 0.9867244362831116, 'ok': True}
print('simmmmmm:', res['target_sim'])
if res['target_sim'] > 0.7:
print('starttime::::', item.start_time, 'endtime:', stable[0].end_time)
return item.start_time - stable[0].end_time #對比成功的靜止分組-第一個靜止分組的end時間(也就是在桌面的時間)