大家好,欢迎来到IT知识分享网。
本文为霍格沃兹测试开发学社学员学习笔记分享
原文链接: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-activity
- Windows: 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
示例
- 下载官方 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.0
- appium-python-client 版本建议 1.2.0
完整代码
import time from appium import webdriver from 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-client from appium import webdriver # 创建一个字典,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" # 创建driver ,与appium server建立连接,返回一个 session driver = 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() # 回收session driver.quit()
# 导入 pip install appium-python-client from time import sleep from appium import webdriver from 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 建立会话
公共部分参数配置
键 |
描述 |
值 |
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) |
例如 1aefc012g |
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()
关闭
- 退出app
- quit()
self.driver.quit()
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/56830.html