软件测试/测试开发丨学习笔记之App自动化用例录制、结构分析

2023-06-01 13:11:33    来源:测试人666

1、自动化用例录制

目录

Appium Inspctor 功能介绍Appium Inspctor 用法介绍

Appium Inspctor 功能介绍

UI 分析录制用例元素查找测试Attcah 已有的 session云测试

用例录制

获取 app 的信息配置待测应用

获取 app 的信息

app 入口,两种方式获取:1、通过 logcat 日志获取Mac/Linux: adb logcat ActivityManager:I | grep “cmp"Windows: adb logcat ActivityManager:I | findstr "cmp"2、通过 aapt 获取Mac/Linux: aapt dump badging wework.apk | grep launchable-activityWindows: aapt dump badging wework.apk | findstr launchable-activity启动应用命令 adb shell am start -W -n <package-name>/<activity-name> -S

配置待测应用

platformName:平台,Android/iOSdeviceName:设备名appPackage:应用的包名appActivity:应用的页面名 ActivitynoReset: 防止清空缓存信息

验证是否启动成功:


(资料图)

Appium inspector 页面结构

功能键

SelectElements:选中元素,查看层级和属性Swipe By Coordinates:通过坐标点滑动Tap By Coordinates:通过坐标点点击Back:返回Refresh Source & Screenshot:刷新页面StartRecording:开始录制脚本Search for element:搜索元素Copy XML Source to Clipboard:复制 xml 结构Quit Session & Close Inspector:退出当前 Session

示例

下载官方 Demo apk(https://github.com/appium/appium/tree/master/sample-code/apps)安装 API Demo.apk

示例-录制用例

打开 API Demo 应用点击 OS,进入下个界面点击【Morse Code】输入内容【ceshiren.com】返回上一个页面返回上一个页面关闭应用

2、自动化测试用例结构分析

desktop 生成用例脚本

el1:点击 OS ,进入下一个页面调用点击方法el2:点击 Morse Code调用sendkeys方法,输入ceshiren.com返回
el1 = driver.find_element_by_accessibility_id("OS")el1.click()el2 = driver.find_element_by_accessibility_id("Morse Code")el2.click()el3 = driver.find_element_by_id("io.appium.android.apis:id/text")el3.clear()el3.send_keys("ceshiren.com")driver.back()driver.back()

用例脚本优化

添加 capability 信息初始化webdriver,添加setup和teardown添加隐式等待和noReset属性增强用例稳定性添加断言注意selenium 版本建议 3.141.0appium-python-client 版本建议 1.2.0

完整代码

import timefrom appium import webdriverfrom appium.webdriver.common.mobileby import MobileByclass TestXueQiu:    def setup(self):        desire_cap = {}        # 平台        desire_cap["platform"] = "Android"        # 设备名        desire_cap["deviceName"] = "emulator"        # app 包名        desire_cap["appPackage"] = "io.appium.android.apis"        # app 页面名        desire_cap["appActivity"] = ".ApiDemos"        self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desire_cap)        self.driver.implicitly_wait(10)    def teardown(self):        time.sleep(3)        # 退出应用        self.driver.quit()    def test_api_demo(self):        """        1、打开 API demo apk        2、点击 OS 控件        3、点击 Morse Code 控件        4、在搜索框中输入 ceshiren.com        5、返回到第一页        6、断言        :return:        """        # 点击 OS 控件        self.driver.find_element_by_accessibility_id("OS").click()        # 点击 Morse Code 控件        self.driver.find_element_by_accessibility_id("Morse Code").click()        # 输入`ceshiren.com`        self.driver.find_element_by_id("io.appium.android.apis:id/text").clear()        self.driver.find_element_by_id("io.appium.android.apis:id/text").send_keys("ceshiren.com")        # 返回第一页        self.driver.back()        self.driver.back()        self.driver.back()        # 选择元素进行断言        result = self.driver.find_element(MobileBy.XPATH,"//*[@resource-id="android:id/text1"][1]")        print(result.text)        # 断言        assert result.text == "Access"ibility"
# 导入 pip install appium-python-clientfrom appium import webdriver# 创建一个字典,desirecapbilitycaps = {}caps["platformName"] = "Android"# Android 包名和页面名,获取命令:# mac/linux: adb logcat ActivityManager:I | grep "cmp"# windows: adb logcat ActivityManager:I | findstr "cmp"caps["appPackage"] = "io.appium.android.apis"caps["appActivity"] = ".ApiDemos"caps["deviceName"] = "emulator-5554"# 创建driver ,与appium server建立连接,返回一个 sessiondriver = webdriver.Remote("http://localhost:4723/wd/hub", caps)el1 = driver.find_element_by_accessibility_id("OS")el1.click()el2 = driver.find_element_by_accessibility_id("Morse Code")el2.click()el3 = driver.find_element_by_id("io.appium.android.apis:id/text")el3.clear()el3.send_keys("ceshiren.com")driver.back()# 返回driver.back()# 回收sessiondriver.quit()
# 导入 pip install appium-python-clientfrom time import sleepfrom appium import webdriverfrom appium.webdriver.common.appiumby import AppiumByclass TestAppDemo:    def setup(self):        # 创建一个字典,desirecapbility        caps = {}        caps["platformName"] = "Android"        # Android 包名和页面名,获取命令:        # mac/linux: adb logcat ActivityManager:I | grep "cmp"        # windows: adb logcat ActivityManager:I | findstr "cmp"        caps["appPackage"] = "io.appium.android.apis"        caps["appActivity"] = ".ApiDemos"        caps["deviceName"] = "emulator-5554"        caps["noReset"] = "true"        # 创建driver ,与appium server建立连接,返回一个 session        # driver 变成self.driver 由局部变量变成实例变量,就可以在其它的方法中引用这个实例变量了        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)        self.driver.implicitly_wait(5)    def teardown(self):        # 回收session        self.driver.quit()    def test_input(self):        # el1 = self.driver.find_element_by_accessibility_id("OS")        el1 = self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, "OS")        el1.click()        # el2 = self.driver.find_element_by_accessibility_id("Morse Code")        el2 = self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Morse Code")        el2.click()        # el3 = self.driver.find_element_by_id("io.appium.android.apis:id/text")        el3 = self.driver.find_element(AppiumBy.ID, "io.appium.android.apis:id/text")        # 清除原有的内容        el3.clear()        el3.send_keys("ceshiren.com")        el3.clear()        # 手动制造关闭应用        sleep(5)        # 启动应用, 热启动,会进入到app 的首页        self.driver.launch_app()        result = self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Accessibility").text        # 断言        assert result == "Accessibility"

3、capability 配置参数解析

目录

capability 含义capability 参数介绍

Capability 简介

功能:配置 Appium 会话,告诉 Appium 服务器需要自动化的平台的应用程序形式:键值对的集合,键对应设置的名称,值对应设置的值主要分为三部分公共部分ios 部分android 部分

Session

Appium 的客户端和服务端之间进行通信的前提通过 Desired Capabilities 建立会话

公共部分参数配置

描述

platformName

使用的手机操作系统

iOS,Android,或者 Firefox0S

platformVersion

手机操作系统的版本

例如 7.1, 4.4

deviceName

使用的手机或模拟器类型

iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4, 等等…. 在 iOS 上,使用 Instruments的 instruments -s devices 命令可返回一个有效的设备的列表。在 Andorid 上虽然这个参数目前已被忽略,但仍然需要添加上该参数

automationName

使用哪个自动化引擎

android默认使用uiautomator2,ios默认使用XCUTest

noReset

在当前 session 下不会重置应用的状态。默认值为 false

true, false

udid

连接的真实设备的唯一设备编号 (Unique device identifier)

例如 1ae203187fc012g

Android 部分特有参数配置

描述

appActivity

Activity 的名字是指从你的包中所要启动的 Android acticity。他通常需要再前面添加. (例如 使用 .MainActivity 代替 MainActivity)

MainActivity, .Settings

appPackage

运行的 Android 应用的包名

com.example.android.myApp, com.android.settings

appWaitActivity

用于等待启动的 Android Activity 名称

SplashActivity

unicodeKeyboard

启用 Unicode 输入,默认为 false

true or false

resetKeyboard


true or false

dontStopAppOnReset

首次启动的时候,不停止 app

true or false

skipDeviceInitialization

跳过安装,权限设置等操作

true or false

iOS 独有

描述

bundleId

被测应用的 bundle ID 。用于在真实设备中启动测试,也用于使用其他需要 bundle ID 的关键字启动测试。在使用 bundle ID 在真实设备上执行测试时,你可以不提供 app 关键字,但你必须提供 udid 。

例如 io.appium.TestApp

autoAcceptAlerts

当 iOS 的个人信息访问警告 (如 位置、联系人、图片) 出现时,自动选择接受( Accept )。默认值 false

true 或者 false

showIOSLog

是否在 appium 日志中显示从设备捕获的任何日志。默认 false

true or false

Desire capability 参数示例

API Demo 启动页配置
{  "platformName": "android",  "deviceName": "emulator-5554",  "appPackage": "io.appium.android.apis",  "appActivity": ".ApiDemos"}

配置优化

添加参数,提高用例的稳定性
{  "noReset": "true", // 不清空缓存信息  "dontStopAppOnReset": "true", // 首次启动的时候,不停止app  "skipDeviceInitialization": "true", // 跳过安装,权限设置等操作  "unicodeKeyBoard": "true" // 输入中文}

4、app 自动化控制

目录

启动数据清理关闭

启动

启动应用方式一:webdriver.remote("url",desirecapability)方式二:launch_app() 将应用启动起来
# 方式一:self.driver = webdriver.Remote\("http://127.0.0.1:4723/wd/hub", desire_cap)# 方式二:self.driver.launch_app()

数据清理

清空输入框内容clear()
self.driver.find_element_by_accessibility_id("SomeAccessibilityID").clear()

关闭

退出appquit()
self.driver.quit()

关键词:

X 关闭

X 关闭