Appium简易Android测试脚本

Appium简易Android测试脚本

前言

前段时间抽空看了下Appium写了一个简单的Android测试脚本。
该脚本主要功能为对Android应用进行一些自动化操作。
根据Appium文档中给出的信息脚本主要运用以下功能。

①自动打开Android应用
②查找元素并操作 (点击,输入,滑动)
③点击屏幕固定坐标
④模拟滑动

准备工作

1、安装及前期准备:点击查看教程
2、测试元素信息:使用Appium,将所需要测试的元素进行提取,例如元素ID,class,index,xpath(不推荐使用xpath定位)。
3、手动操作一次,估算并记录页面加载,缓冲,切换的时间,后期防止程序出错需要增加等待时间(特别以坐标定位方式进行操作建议增加等待时间)。

实施

1、首先建议只写打开APP的这一步骤,排除Appium服务没有正常启动
2、写执行脚本

#!/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,初始化自动化环境
from selenium.webdriver.common.by import By
import time
from appium import webdriver

# 引入ADB命令
import os, re

# os.system('chcp 65001')  # 将cmd的显示字符编码从默认的GBK改为UTF-8
# deviceName = os.popen("adb devices").read()  # 设备名称
# platformVersion = os.popen("adb shell getprop ro.build.version.release").read()  # 安卓版本
# appPackage = os.popen("adb shell dumpsys window w |findstr \/ |findstr name=").read()  # 软件名称

desired_caps = \
    {
        "deviceName": "0123456789ABCDEF",
        "platformName": "Android",
        "platformVersion": "4.4.2",  # 4.4.2  8.1.0
        "appPackage": "*.sportinspect", # 改成你测试APP的包名。不懂看准备工作的第1步骤
        "appActivity": "*.sportinspect.SplashScreenActivity", # 改成你测试APP的活动。不懂看准备工作的第1步骤。
        "newCommandTimeout": 0,  # 设置超时时间, 默认为60s,设置为0关闭。超时时间到后,软件将退出
        "unicodeKeyboard": True,  # unicode编码输入  解决send_keys无法输入中文
        "resetKeyboard": True,  # 隐藏软键盘  解决send_keys无法输入中文
        "automationName": "UiAutomator1", # 安卓版本大于5这里改为"UiAutomator2"
        "noReset": True  # 设置不清除软件缓存,不写或者False则清除App缓存
    }

time_list = []


# 需要点击的元素
# by:By 查找元素的方式
# value:Value  
# initial:是否重新打开软件
# index: 可变参数。0元素点击, 1坐标点击, 2输入文本, 3滑动坐标
def find_element(by, value, initial=0, *index):
    global driver
    start_time = time.time()
    index_class = None

    # initial==1时,重启软件
    if initial == 1:
        driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
        start_time = time.time()

    # 可变变量*index值长度判断,需要执行的动作是点击还是输入滑动
    for index_class in index:
        print(index_class, type(index_class))

    # 循环查找需要执行的元素
    while True:
        try:
            if len(str(find_element)) >= 0:
                time_consuming = time.time() - start_time
                time_list.append('%.3f' % time_consuming)  # 保留三位小数,精确到1ms
                print('元素%s %s已经找到,共耗时%s' % (by, value, time_consuming))

                # 可变变量*index值判断执行的动作是点击还是输入滑动,0元素点击,1坐标点击,2文本键入,3滑动
                if index_class == 0:
                    click_element(by, value, *index)
                    break
                elif type(index_class) == list:
                    # 1表示查找坐标点击 | [1,(x, y),tap_sleep] & 范围坐标点击[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))  # 当出现字典时2所对应的是输入
                    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('请检查方法调用输入值是否正确')
                break
        except:
            print('没找到', 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:是否重新调用软件,0不重新调用,1则重新调用
# index:可选参数
	# 0代表查找元素点击 | 0
	# 1表示查找坐标点击 | [1,(x, y),tap_sleep] & 范围坐标点击[1,(x1, y1),(x2, y2), tap_sleep]
	# 2表示键入文本 | {2: '文本'}
	# 滑动好像忘了写了,尴尬!!!

# 流程示例
while True: # 循环执行下面步骤
    find_element('class name', 'android.widget.Button', 1, 0)  # 启动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])  # 心电测量
    time.sleep(40)
    find_element('id', '*.sportinspect:id/btn_start', 0, 0)  # 提交
    time.sleep(2)
    find_element('id', '*.sportinspect:id/md_buttonDefaultPositive', 0, 0)  # 提交确认
    time.sleep(2)
    find_element('id', '*.sportinspect:id/iv_close', 0, 0)  # 提交完成


后记

上述脚本是个简单的测试小功能,后面如果有时间考虑做成读取Excel进行执行。每次操作步骤都写在Excel中,脚本读取Excel后执行相关动作。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值