您当前的位置: 首页 > 宏观 > > 内容页

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

来源:测试人666 2023-06-01 14:00:19

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
推荐阅读 更多
软件测试/测试开发丨学习笔记之App自动化用例录制、结构分析_环球快播报

本文为霍格沃兹测试开发学社学员学习笔记分享原文链接:App自动化用例录制、结构分析L1-学习笔记-测试人社

2023-06-01
浙江海宁一临时工棚发生爆燃事故 造成5人死亡-热头条

浙江海宁市政府新闻办公室发布消息:6月1日0时01分接到群众报警,海宁市黄湾镇闸口村一临时工棚发生一起爆

2023-06-01
当前消息!F1世界冠军费尔南多·阿隆索的法拉利Enzo即将拍卖 售价或超3800万人民币

法拉利F1车队冠军车手费尔南多·阿隆索的法拉利ENZO即将在6月8日举行的摩纳哥汽车拍卖会L & 039;AstaRossa活动中

2023-06-01
国际油价,一个月大跌10%!什么情况?

5月31日欧洲主要三大股指全部跌超1%欧洲市场方面,投资者同样在密切关注美国债务上限协议的进展,避险情绪

2023-06-01
自学单簧管教程_单簧管教程

1、《单簧管教程》是2005年由同心出版社出版的图书,作者是庞亮。2、本书按照循序渐进、由浅入深的原则,合

2023-06-01
绿岛风:截至2023年5月31日公司股东总户数为6,994户 世界热点评

绿岛风(301043)06月01日在投资者关系平台上答复了投资者关心的问题。

2023-06-01
【新要闻】刘慈欣:科幻作家未来会被AI代替

App6月1日消息,科幻小说作家刘慈欣日前现身在北京召开的2023年中国科幻大会。在谈到“人工智能将会给科幻

2023-06-01
常州工学院新校区宿舍(常州工学院新校区) 当前播报

大家好,小乐来为大家解答以上的问题。常州工学院新校区宿舍,常州工学院新校区这个很多人还不知道,现在让我

2023-06-01
中恒集团:融资余额4.13亿元,创近一年新低(05-31)-世界观天下

2023年5月31日中恒集团融资余额4 13亿元,创近一年新低

2023-06-01
市关工委到梁园区开展“六一”慰问捐赠活动

5月30日,市关工委到梁园区启蒙幼儿园开展“六一”慰问捐赠活动,市关工委主任庄敬山、执行主任周金铎出席

2023-06-01