写点什么

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

作者:测试人
  • 2023-05-31
    北京
  • 本文字数:3760 字

    阅读完需:约 12 分钟

本文为霍格沃兹测试开发学社学员学习笔记分享

原文链接:App自动化 用例录制、结构分析 L1 - 学习笔记 - 测试人社区

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/iOS

  • deviceName:设备名

  • appPackage:应用的包名

  • appActivity:应用的页面名 Activity

  • noReset: 防止清空缓存信息




验证是否启动成功:


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

示例

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

  2. 安装 API Demo.apk

示例-录制用例

  1. 打开 API Demo 应用

  2. 点击 OS,进入下个界面

  3. 点击【Morse Code】

  4. 输入内容【ceshiren.com】

  5. 返回上一个页面

  6. 返回上一个页面

  7. 关闭应用


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 MobileBy

class 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 sleep
from appium import webdriverfrom appium.webdriver.common.appiumby import AppiumBy

class 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 建立会话

公共部分参数配置


Android 部分特有参数配置


iOS 独有


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()
复制代码


发布于: 刚刚阅读数: 4
用户头像

测试人

关注

专注于软件测试开发 2022-08-29 加入

霍格沃兹测试开发学社,测试人社区:https://ceshiren.com/t/topic/22284

评论

发布
暂无评论
软件测试/测试开发丨学习笔记之App自动化用例录制、结构分析_程序员_测试人_InfoQ写作社区