赞
踩
前段时间抽空看了下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后执行相关动作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。