软件测试/测试开发丨学习笔记之App自动化用例录制、结构分析
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()
关键词:
上一篇:黄金期货韧性十足 短期或有新高
下一篇:最后一页
- 软件测试/测试开发丨学习笔记之App自动化用例录制、结构分析
- 黄金期货韧性十足 短期或有新高
- 外媒:苹果MR头显设计独特复杂 给生产带来前所未有的挑战_每日速读
- 部分地区中小学负责人一席谈——增加体育锻炼时间 培养正确用眼习惯(防控青少年近视大家谈③)_当前简讯
- 每日速讯:超越苹果M2 AMD锐龙7000全新AI性能实战:等14代酷睿来战
- 宝钛股份:5月31日融资买入482.99万元,融资融券余额6.29亿元
- 热点在线丨小鸡宝宝考考你成语无肠公子是古人对哪种动物的别称
- 百强房企前5个月销售额近3万亿元 6月份市场会好转吗?
-
谁是宋仁宗的下一任皇帝?|全球讯息
1、宋英宗赵曙(公元1032年2月16日-公元1067年1月25日),原名赵宗实,后改名赵曙,是濮王赵允让之子,过继给宋
-
5月31日基金净值:华商双擎领航混合最新净值0.6847,涨2.1% 每日看点
5月31日,华商双擎领航混合最新单位净值为0 6847元,累计净值为0 6847元,较前一交易日上涨2 1%。历史数据
-
世界观热点:武汉学生被老师碾压后续,赔偿金260万,两名搭车女老师被骂惨
武汉一小学一年级孩子谭某,被老师的车辆碾压致死,已经过去一段日子,前几日,校方领导在学校门口举行祭拜
-
关于食品安全的文章内容 关于食品安全的文章|信息
今天来聊聊于食品安全的文章内容,品安全的文章的文章,现在就为大家来简单介绍下品安全的文章内容,品安全
X 关闭
X 关闭