Appium簡(jiǎn)易Android測(cè)試腳本
前言
前段時(shí)間抽空看了下Appium寫(xiě)了一個(gè)簡(jiǎn)單的Android測(cè)試腳本。
該腳本主要功能為對(duì)Android應(yīng)用進(jìn)行一些自動(dòng)化操作。
根據(jù)Appium文檔中給出的信息腳本主要運(yùn)用以下功能。
①自動(dòng)打開(kāi)Android應(yīng)用
②查找元素并操作 (點(diǎn)擊,輸入,滑動(dòng))
③點(diǎn)擊屏幕固定坐標(biāo)
④模擬滑動(dòng)
準(zhǔn)備工作
1、安裝及前期準(zhǔn)備:點(diǎn)擊查看教程
2、測(cè)試元素信息:使用Appium,將所需要測(cè)試的元素進(jìn)行提取,例如元素ID,class,index,xpath(不推薦使用xpath定位)。
3、手動(dòng)操作一次,估算并記錄頁(yè)面加載,緩沖,切換的時(shí)間,后期防止程序出錯(cuò)需要增加等待時(shí)間(特別以坐標(biāo)定位方式進(jìn)行操作建議增加等待時(shí)間)。
實(shí)施
1、首先建議只寫(xiě)打開(kāi)APP的這一步驟,排除Appium服務(wù)沒(méi)有正常啟動(dòng)
2、寫(xiě)執(zhí)行腳本文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-531439.html
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Time : 2023/4/25 9:27
# Author : kevin
# User : VINNO-Van
# Software: PyCharm
# File : vinno_package.py
# 連接Appium Server,初始化自動(dòng)化環(huán)境
from selenium.webdriver.common.by import By
import time
from appium import webdriver
# 引入ADB命令
import os, re
# os.system('chcp 65001') # 將cmd的顯示字符編碼從默認(rèn)的GBK改為UTF-8
# deviceName = os.popen("adb devices").read() # 設(shè)備名稱(chēng)
# platformVersion = os.popen("adb shell getprop ro.build.version.release").read() # 安卓版本
# appPackage = os.popen("adb shell dumpsys window w |findstr \/ |findstr name=").read() # 軟件名稱(chēng)
desired_caps = \
{
"deviceName": "0123456789ABCDEF",
"platformName": "Android",
"platformVersion": "4.4.2", # 4.4.2 8.1.0
"appPackage": "*.sportinspect", # 改成你測(cè)試APP的包名。不懂看準(zhǔn)備工作的第1步驟
"appActivity": "*.sportinspect.SplashScreenActivity", # 改成你測(cè)試APP的活動(dòng)。不懂看準(zhǔn)備工作的第1步驟。
"newCommandTimeout": 0, # 設(shè)置超時(shí)時(shí)間, 默認(rèn)為60s,設(shè)置為0關(guān)閉。超時(shí)時(shí)間到后,軟件將退出
"unicodeKeyboard": True, # unicode編碼輸入 解決send_keys無(wú)法輸入中文
"resetKeyboard": True, # 隱藏軟鍵盤(pán) 解決send_keys無(wú)法輸入中文
"automationName": "UiAutomator1", # 安卓版本大于5這里改為"UiAutomator2"
"noReset": True # 設(shè)置不清除軟件緩存,不寫(xiě)或者False則清除App緩存
}
time_list = []
# 需要點(diǎn)擊的元素
# by:By 查找元素的方式
# value:Value
# initial:是否重新打開(kāi)軟件
# index: 可變參數(shù)。0元素點(diǎn)擊, 1坐標(biāo)點(diǎn)擊, 2輸入文本, 3滑動(dòng)坐標(biāo)
def find_element(by, value, initial=0, *index):
global driver
start_time = time.time()
index_class = None
# initial==1時(shí),重啟軟件
if initial == 1:
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
start_time = time.time()
# 可變變量*index值長(zhǎng)度判斷,需要執(zhí)行的動(dòng)作是點(diǎn)擊還是輸入滑動(dòng)
for index_class in index:
print(index_class, type(index_class))
# 循環(huán)查找需要執(zhí)行的元素
while True:
try:
if len(str(find_element)) >= 0:
time_consuming = time.time() - start_time
time_list.append('%.3f' % time_consuming) # 保留三位小數(shù),精確到1ms
print('元素%s %s已經(jīng)找到,共耗時(shí)%s' % (by, value, time_consuming))
# 可變變量*index值判斷執(zhí)行的動(dòng)作是點(diǎn)擊還是輸入滑動(dòng),0元素點(diǎn)擊,1坐標(biāo)點(diǎn)擊,2文本鍵入,3滑動(dòng)
if index_class == 0:
click_element(by, value, *index)
break
elif type(index_class) == list:
# 1表示查找坐標(biāo)點(diǎn)擊 | [1,(x, y),tap_sleep] & 范圍坐標(biāo)點(diǎn)擊[1,(x1, y1),(x2, y2), tap_sleep]
# tap_sleep = index
# driver.tap([], tap_sleep)
if len(index_class) == 3:
print([index_class[1]])
driver.tap([index_class[1]], index_class[2])
elif len(index_class) == 4:
print([index_class[1], index_class[2]])
driver.tap([index_class[1], index_class[2]], index_class[3])
break
elif type(index_class) == dict:
driver.find_element(by, value).click()
driver.find_element(by, value).send_keys(index_class.get(2)) # 當(dāng)出現(xiàn)字典時(shí)2所對(duì)應(yīng)的是輸入
break
elif type(index_class) == tuple:
driver.swipe(index_class[0], index_class[1], index_class[2], index_class[3], index_class[4])
break
break
else:
print('請(qǐng)檢查方法調(diào)用輸入值是否正確')
break
except:
print('沒(méi)找到', value)
#
def click_element(by, value, *index):
# 元素定位方法 :ID, XPATH, LINK_TEXT, PARTIAL_LINK_TEXT,
# NAME,TAG_NAME,CLASS_NAME,CSS_SELECTOR,__dict__,__weakref__,
# Appium元素欄 :id, xpath, link text, partial link text, name, tag name, class name, css selector
if str(by) == 'id':
if len(index) > 0:
driver.find_elements(by=By.ID, value=value)[index[0]].click()
else:
driver.find_element(by=By.ID, value=value).click()
elif str(by) == 'xpath':
if len(index) > 0:
driver.find_elements(by=By.XPATH, value=value)[index[0]].click()
else:
driver.find_element(by=By.XPATH, value=value).click()
elif str(by) == 'link text':
if len(index) > 0:
driver.find_elements(by=By.LINK_TEXT, value=value)[index[0]].click()
else:
driver.find_element(by=By.LINK_TEXT, value=value).click()
elif str(by) == 'partial link text':
if len(index) > 0:
driver.find_elements(by=By.PARTIAL_LINK_TEXT, value=value)[index[0]].click()
else:
driver.find_element(by=By.PARTIAL_LINK_TEXT, value=value).click()
elif str(by) == 'name':
if len(index) > 0:
driver.find_elements(by=By.NAME, value=value)[index[0]].click()
else:
driver.find_element(by=By.NAME, value=value).click()
elif str(by) == 'tag name':
if len(index) > 0:
driver.find_elements(by=By.TAG_NAME, value=value)[index[0]].click()
else:
driver.find_element(by=By.TAG_NAME, value=value).click()
elif str(by) == 'class name':
if len(index) > 0:
driver.find_elements(by=By.CLASS_NAME, value=value)[index[0]].click()
else:
driver.find_element(by=By.CLASS_NAME, value=value).click()
elif str(by) == 'css selector':
if len(index) > 0:
driver.find_elements(by=By.CSS_SELECTOR, value=value)[index[0]].click()
else:
driver.find_element(by=By.CSS_SELECTOR, value=value).click()
# (by, value, initial=0, *index):
# by:By
# value:Value
# initial:是否重新調(diào)用軟件,0不重新調(diào)用,1則重新調(diào)用
# index:可選參數(shù)
# 0代表查找元素點(diǎn)擊 | 0
# 1表示查找坐標(biāo)點(diǎn)擊 | [1,(x, y),tap_sleep] & 范圍坐標(biāo)點(diǎn)擊[1,(x1, y1),(x2, y2), tap_sleep]
# 2表示鍵入文本 | {2: '文本'}
# 滑動(dòng)好像忘了寫(xiě)了,尷尬?。?!
# 流程示例
while True: # 循環(huán)執(zhí)行下面步驟
find_element('class name', 'android.widget.Button', 1, 0) # 啟動(dòng)APP
time.sleep(2)
find_element('id', '*.sportinspect:id/et_pwd', 0, [1, (766, 240), 1000]) # 登錄
time.sleep(10)
find_element('class name', 'android.widget.Button', 0, [1, (345, 700), 1000]) # 心電測(cè)量
time.sleep(40)
find_element('id', '*.sportinspect:id/btn_start', 0, 0) # 提交
time.sleep(2)
find_element('id', '*.sportinspect:id/md_buttonDefaultPositive', 0, 0) # 提交確認(rèn)
time.sleep(2)
find_element('id', '*.sportinspect:id/iv_close', 0, 0) # 提交完成
后記
上述腳本是個(gè)簡(jiǎn)單的測(cè)試小功能,后面如果有時(shí)間考慮做成讀取Excel進(jìn)行執(zhí)行。每次操作步驟都寫(xiě)在Excel中,腳本讀取Excel后執(zhí)行相關(guān)動(dòng)作。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-531439.html
到了這里,關(guān)于Appium簡(jiǎn)易Android測(cè)試腳本的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!