天天看點

MAC Python Appium 安卓真機 APP自動化測試

1.環境配置

Appium

Appium-desktop

Android sdk

Java

Mac

手機連接配接電腦,開發者調試模式

2.appium-desktop配置連接配接Android真機

2.1 開啟appium服務

MAC Python Appium 安卓真機 APP自動化測試

點選Edit Configurations配置Android SDK和Java的環境變量,如下圖

MAC Python Appium 安卓真機 APP自動化測試

再點選Start Server按鈕,進入下圖

MAC Python Appium 安卓真機 APP自動化測試

點選上圖,🔍圖示,配置一些手機和APP資訊,如下圖

MAC Python Appium 安卓真機 APP自動化測試

然後點選Start session按鈕,不報錯,則已連接配接成功

3.Android自動化測試代碼結構

代碼結構如下圖

MAC Python Appium 安卓真機 APP自動化測試

TestCase目錄用于存放測試用例,用例檔案test開頭

如test_android_xxx.py

from appium import webdriver
import unittest
import time
from time import sleep
from KeyWord import KeyWords
from settings import *


class AndroidAppAutoTest(unittest.TestCase):

    def setUp(self):
        print("=======start!=======")
        self.pro = KeyWords(url, desired_caps)
        sleep(5)

    def tearDown(self):
        print("=======stop!=======")

    def test_connect(self):
        """
        測試連接配接功能
        :return:
        """

        print("測試開始!")
        # 發起任務
        self.pro.click_element('id',connect_id)

           

functions.py:主要存放一些函數如釘釘報警

# -*- coding:utf-8 -*-
# store any function
import string
import traceback
import hashlib
import requests

import random
Dinging_Webhook = "https://oapi.dingtalk.com/robot/send?access_token=087e8dc03b1xxxxxxxxxxxxxx"


def DingDingalert(msg):
    """
    send alert info by DingDing
    :param msg:
    :return:
    """
    data = {
        'msgtype': 'text',
        'text': {
            "content": msg
        },
    }
    try:
        return requests.post(Dinging_Webhook, json=data)
    except:
        traceback.print_exc()


def getMessage(filepath):
    message = ""
    for line in open(filepath):
        message = message + line
    # print(message)
    return message


def RandomEmail():
    randomemail = ''.join(random.sample(string.ascii_letters + string.digits, 8)) + "@xx.com"
    # print(randomemail)
    return randomemail

           

HTMLTestRunner.py: 用于生成HTML測試報告,百度下載下傳放目錄裡即可

KeyWord.py: 用于存放自動化測試中需要反複使用的關鍵字如定位元素,點選操作等

from appium import webdriver


class KeyWords(object):

    def __init__(self, url, desired_caps):
        """
        初始化動作:連接配接手機
        :param url:
        :param desired_caps:
        """
        self.driver = webdriver.Remote(url, desired_caps)

    def locator(self, locator_type, value):
        """
        元素定位
        :param locator_type:
        :param value:
        :return: e
        """
        if locator_type == 'xpath':
            e = self.driver.find_element_by_xpath(value)
            return e
        elif locator_type == 'id':
            e = self.driver.find_element_by_id(value)
            return e
        elif locator_type == 'name':
            e = self.driver.find_element_by_name(value)
            return e
        elif locator_type == 'css':
            e = self.driver.find_element_by_css_selector(value)
            return e


    def input_text(self, locator_type, value, text):
        """
        文本框輸入内容
        :param locator_type:
        :param value:
        :param text:
        """
        self.locator(locator_type, value).send_keys(text)

    def click_element(self, locator_type, value):
        """
        元素點選
        :param locator_type:
        :param value:
        """
        self.locator(locator_type, value).click()

           

run_all_cases.py:用于執行程式

# -*- coding:utf-8 -*-
# 伺服器一般預設是Python2,是以第一句申明最好加上
import os
import unittest
from functions import *
import time
import HTMLTestRunner  # 需下載下傳HTMLTestRunner.py放在Python目錄site-packages下


def all_case():
    testcase_dir = os.path.join(os.getcwd(), "TestCase")  # 也可以用絕對目錄存放測試用例的目錄,定時任務時釘釘消息可能不會發,改成絕對目錄就好了
    print(testcase_dir)
    testcase = unittest.TestSuite()  # 初始化一個測試套件用來裝測試用例
    discover = unittest.defaultTestLoader.discover(testcase_dir, pattern="test*.py",
                                                   top_level_dir=None)  # 尋找TestCase下所有test開頭的測試用例
    testcase.addTests(discover)
    print(testcase)
    return testcase


if __name__ == "__main__":
    # test report 為了友善發送釘釘消息,把測試結果儲存到TXT文檔裡
    with open('TextReport.txt', 'w') as f:
        runner = unittest.TextTestRunner(stream=f, verbosity=2)
        runner.run(all_case())
    # send report to dingding
    msg = getMessage("TextReport.txt")  # 讀取檔案内容儲存到變量用于釘釘消息發送
    print("**************************")
    print(msg)
    #DingDingalert(msg)
    if 'ERROR' in msg:
        pass
        DingDingalert(msg)  # 調用Dingding函數發消息
    else:
        pass

    # 以下是生成測試報告的寫法,不需要則注釋
    # 擷取目前時間

    # now = time.strftime("%Y-%m-%d %H-%M-%S")
    # # 定制報告名稱
    # filename = now + '_TestReport.html'
    # # 向報告寫入測試結果資料
    # fp = open(filename, 'wb')
    # runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='自動化測試報告', description='浏覽器:chrome')
    # # 運作測試集
    # runner.run(all_case())
    # # 關閉報告檔案
    # fp.close()

           

settings.py: 存放一些配置,變量資訊如URL,手機APP資訊

desired_caps_master_pro = {
    "platformName": "Android",
    "platformVersion": "11",
    "deviceName": "VIVO",
    "appPackage": "free.xxxxxxx",
    "appActivity": "free.xxxxx.activity.MainActivity",
    "udid": "7PXOSONNFQXXXX"
}

url = 'http://localhost:4723/wd/hub'

           

以上,有疑問可以評論讨論。