本文是基於Python+uiautomator+adb命令,實現簡單的Android自動化測試入門教程
此入門教程需要準備以下事項
1、Python 3.6環境,Python語言基礎
參考鏈接:https://www.cnblogs.com/wongyi/p/7832138.html
2、Python導入uiautomator模塊
配置pip環境變量 在這個路徑下 Python\Python36-32\Scripts
cmd 中輸入pip insatll uiautomator
出現Successfully後
進入 Python 輸入import uiautomator 沒有報異常說明模塊可以正常使用
說明文檔地址:https://blog.csdn.net/Eugene_3972/article/details/76629066
3、Android SDK自帶的uiautomatorviewer
4、adb環境,有Android SDK也就有adb的
接下來進入主題
首先要找到uiautomatorviewer工具,爲方便下次使用可以發到桌面快捷方式
然後手機連上PC,開啓開發者選項,開啓USB調試
點擊菜單欄第二個圖標,即可獲取手機當前界面元素,動態界面可能會無法獲取到元素
提示:如果在這一步無法獲取到界面元素,可以找到這個路徑C:\Users\FirmDapeng\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\uiautomator-0.3.2-py3.6.egg\uiautomator\libs(也可以直接在Python安裝路徑下搜uiautomator)的apk文件
adb install 安裝
如果安裝失敗,執行一下這兩個命令:
adb uninstall com.github.uiautomator
adb uninstall com.github.uiautomator.test
回到 uiautomator
注意紅框中的三個元素,其中兩個元素在腳本中的寫法和顯示的不一樣
text resourceId className
有了這些元素我們就可以開始進行簡單的Android UI自動化測試
下面是一個簡單的測試腳本,我會逐行給大家講解
這個腳本里可以在出現界面異常時,自動截圖後發送到我指定的郵箱中,調用的腳本我會附在文末
duoji-UI-test.py
#-*- coding:UTF-8 -*-
# author:Peng Ji time:2018/5/11
import os #導入系統命令模塊,用於調用adb命令來啓動指定APP
import time #導入時間模塊,用於調用時間等待
import automail #這裏是導入我打包的自動發送mail腳本
import uiautomator #導入uiautomator模塊
from uiautomator import device as d #導入uiautomator模塊中的device方法命名爲d
Phone=d.info #d.info會返會設備信息,需要注意的是,返回的是字典型
print(Phone) #在屏幕上打印出設備信息
h=Phone['displayHeight'] #這裏是從設備信息中獲取屏幕的尺寸
w=Phone['displayWidth']
def devicesInfo():
print('獲取設備信息')
Phone=d.info #d.info會返會設備信息,需要注意的是,返回的是字典型
print(Phone) #在屏幕上打印出設備信息
try:
devicesInfo()#這裏是捕獲各種異常,出現異常會提示 "獲取設備信息失敗,請檢查設備連接"
except:
print("獲取設備信息失敗,請檢查設備連接")
def LaunchAPP():
print('啓動APP')
os.system("adb shell monkey -p com.hlhdj.duoji -c android.intent.category.LAUNCHER 1")
#這裏是調用cmd adb shell 啓動指定的APP ,這裏的包名可以從uiautomatorviewer 中看到
if d(resourceId="com.hlhdj.duoji:id/home_topbar_rl_search").wait.exists(timeout=20000):
#這裏時判斷APP首頁中指定元素是否出現
print("APP啓動成功")
else:
print("APP首頁搜索框加載時間超過20S")
try:
LaunchAPP()
except:
print("APP啓動失敗")
print('啓動APP')
time.sleep(8)
H1=int(h*(1810/1920))#首頁按鈕Y座標 #這裏就用的之前獲取的屏幕尺寸,這樣即使更換不同屏幕分辨率的設備,依然可以點擊到對應座標元素
W1=int(w*(86/1080))#首頁按鈕X座標
d.click(W1,H1) #這裏就是點擊座標
print('點擊首頁')
time.sleep(2)
d(resourceId="com.hlhdj.duoji:id/linear_icon_jingxuan").click()
#這裏是點擊指定的元素,括號裏面是選擇器,找到指定滿足條件的元素後,進行點擊
可以是text resourceId className
print('進入精選')
time.sleep(5)
if d(text="綜合").exists: #這裏是進行一個判斷,如果點擊後的界面出現 text="綜合" 這個元素,就打印出成功
print('哆集精選進入成功')
time.sleep(2)
d.press.back() #這個是點擊返回按鍵
else:
A1='哆集精選進入失敗' #這裏是打印出失敗,同時賦值給截圖這個方法,生成一張截圖名稱就是 哆集精選進入失敗.png
print(A1)
d.screenshot(A1+'.png') #截圖生成路徑和運行腳本是同一個路徑
d.press.back()
d(resourceId="com.hlhdj.duoji:id/linear_groabl").click()
print('進入全球購')
time.sleep(8)
if d(text="全球購首頁").exists:
print('全球購進入成功')
time.sleep(2)
d.press.back()
else:
A1 = '全球購進入失敗'
print(A1)
d.screenshot(A1 + '.png')
d.press.back()
d(resourceId="com.hlhdj.duoji:id/linear_desiger").click()
print('進入設計館')
time.sleep(5)
if d(text="設計館").exists:
print('設計館進入成功')
time.sleep(2)
d.press.back()
else:
A1 = '設計館進入失敗'
print(A1)
d.screenshot(A1 + '.png')
A=A1
automail.send(A) #將報錯的截圖添加到前面導入的automail模塊中,通過mail中發送到指定的郵箱
d.press.back()
d(resourceId="com.hlhdj.duoji:id/linear_kefu").click()
print('進入客服中心')
time.sleep(3)
if d(text="哆集登陸").exists: #這裏也是判斷,進入客服中心欄目出現“哆集登錄” 就是未登錄狀態,需要進行登錄
print('未登錄賬號')
d(resourceId="com.hlhdj.duoji:id/activity_loagin_user_phone").clear_text() #這裏是清除指定元素的內容
d(resourceId="com.hlhdj.duoji:id/activity_loagin_user_phone").set_text("18111269811") #這裏是在指定元素中輸入指定內容
print('輸入賬戶')
d(resourceId="com.hlhdj.duoji:id/activity_loagin_user_password").set_text("111111")
print('輸入密碼')
d(resourceId="com.hlhdj.duoji:id/activity_login_tv_login").click()
print('登陸完成')
d(resourceId="com.hlhdj.duoji:id/linear_kefu").click()
print('進入客服中心')
if d(text="哆集客服").exists: #這裏就是已經登錄的判斷,如果出現“哆集客服”,就是已經登錄的狀態
print('客服中心進入成功')
time.sleep(2)
d.press.back()
else:
A1 = '客服中心進入失敗'
print(A1)
d.screenshot(A1 + '.png')
import automail
A=A1
automail.send(A)
d.press.back()
time.sleep(6)
H5=int(h*(1810/1920))#個人中心按鈕Y座標
W5=int(w*(950/1080))#個人中心按鈕X座標
d.click(W5,H5)
print('點擊個人中心')
d(resourceId="com.hlhdj.duoji:id/fragment_info_topbar_rb_setting").click()
print('點擊設置')
d(resourceId="com.hlhdj.duoji:id/text_unregist_login").click()
print('退出當前賬號')
d(resourceId="android:id/button1").click()
print('確定')
time.sleep(3)
for i in range(1,4):
d.press.back() #循環點擊返回鍵,退出APP
print('點擊返回',i)
automail.py
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
def send(A):
sender = '[email protected]'
receivers = '[email protected]'
my_pass = 'hinaggavztdcbbhg'
message = MIMEMultipart('related')
subject = '哆集商城界面出現異常'
message['Subject'] = subject
message['From'] = sender
message['To'] = receivers
content = MIMEText('<html><body><img src="cid:imageid" alt="imageid"></body></html>','html','utf-8')
message.attach(content)
file=open(A+'.png', "rb")
img_data = file.read()
file.close()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'imageid')
message.attach(img)
try:
server=smtplib.SMTP_SSL("smtp.qq.com",465)
server.login(sender,my_pass)
server.sendmail(sender,receivers,message.as_string())
server.quit()
print ("郵件發送成功")
except smtplib.SMTPException as e:
print(e)
monitor.py #實現自定義時間監測需要執行這個腳本
import datetime
import os
import time
date = datetime.datetime.now()
time1 = date.strftime('%H')
# time1 = date.strftime('%M')
time1 = int(time1)
loop = 0
while time1 <= 23:
import os
os.system("python C:/Users/FirmDapeng/Desktop/test/duoji-UI-test.py")
date = datetime.datetime.now()
time1 = date.strftime('%H')
print(time1)
time1 = int(time1)
loop = loop + 1
print("執行第%s次" % loop)
time.sleep(180)
print("時間到停止監測")