Python+uiautomator實現Android自動化測試

本文是基於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("時間到停止監測")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章