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

软件测试/测试开发丨学习笔记之App自动化用例录制、结构分析本文为霍格沃兹测试开发学社学员学习笔记分享原文链接:App自动化 用例录制、结构分析 L1 – 学习笔记 – 测试人社区1、自动化用例录制目录A

大家好,欢迎来到IT知识分享网。

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

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

1、自动化用例录制

目录

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

Appium Inspctor 功能介绍

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

用例录制

  • 获取 app 的信息
  • 配置待测应用
软件测试/测试开发丨学习笔记之App自动化用例录制、结构分析

软件测试/测试开发丨学习笔记之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: 防止清空缓存信息
软件测试/测试开发丨学习笔记之App自动化用例录制、结构分析

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

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

验证是否启动成功:

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

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. 关闭应用
软件测试/测试开发丨学习笔记之App自动化用例录制、结构分析

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() 将应用启动起来
软件测试/测试开发丨学习笔记之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

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信