官方appium文档 https://appium.io/docs/en/about-appium/getting-started/index.html
引用参考 https://www.cnblogs.com/ngngng/p/15338944.html
appium uiautomator2 airtest比较 appium(android) 支持Android、ios、H5自动化测试(集成了UiAutomator、UiAutomation框架) 最底层实际上是基于uiautomator2的,在上层封装了一层,使得可以使用webdriver的方式编写自动化脚本 uiautomator2 只针对原生的android应用 airtest 只支持pthon语言 Airtest与Poco本质上是python的两个第三方库 该框架最突出的优点是图像识别,还没阅读过源码,看到相关资料,推断出它就是OpenCV(图像识别)+ uiautomator实现的
**
Appium 介绍
** Appium 是一个开源工具,用于自动化 iOS 手机、 Android 手机和 Windows 桌面平台上的原生、移动 Web 和混合应用。「原生应用」指那些用 iOS、 Android 或者 Windows SDKs 编写的应用。「移动 Web 应用」是用移动端浏览器访问的应用( Appium 支持 iOS 上的 Safari 、Chrome 和 Android 上的内置浏览器)。「混合应用」带有一个「webview」的包装器——用来和 Web 内容交互的原生控件。类似于 Apache Cordova 项目,创建一个混合应用使得用 Web 技术开发然后打包进原生包装器创建一个混合应用变得容易了。
重要的是,Appium 是跨平台的:它允许你用同样的 API 对多平台(iOS、Android、Windows)写测试。做到在 iOS、Android 和 Windows 测试套件之间复用代码。
了解 Appium “支持”这些平台意味着什么、有哪些自动化方式的详细信息,请参见 Appium 支持的平台。
Appium 的理念 Appium 旨在满足移动端自动化需求的理念,概述为以下四个原则:
你不应该为了自动化而重新编译你的应用或以任何方式修改它。 你不应该被限制在特定的语言或框架上来编写运行测试。 移动端自动化框架不应该在自动化接口方面重造轮子。 移动端自动化框架应该开源,在精神、实践以及名义上都该如此。 Appium 的设计 那么 Appium 项目的架构是如何实现这些理念的呢?为了实现理念#1,我们使用了系统自带的自动化框架。这样,我们不需要把 Appium 特定的或者第三方的代码编译进你的应用,这意味着你测试使用的应用与最终发布的应用并无二致。我们使用以下系统自带的自动化框架:
iOS 9.3 及以上: 苹果的 XCUITest iOS 9.3 及以下: 苹果的 UIAutomation Android 4.3+: 谷歌的 UiAutomator / UiAutomator2 Android 2.3+: 谷歌的 Instrumentation. (通过绑定独立的项目—— Selendroid 提供对 Instrumentation 的支持) Windows: 微软的 WinAppDriver 为了实现理念#2,我们把这些系统本身提供的框架包装进一套 API —— WebDriver API 中。WebDriver(也叫「Selenium WebDriver」)规定了一个客户端-服务器协议(称为 JSON Wire Protocol),按照这种客户端-服务器架构,可以使用任何语言编写的客户端向服务器发送适当的 HTTP 请求。已经有为 各个流行编程语言编写的客户端 。这也意味着你可以自由使用任何你想用的的测试运行器和测试框架;客户端程序库不过是一个简单的 HTTP 客户端,可以以任何你喜欢的方式混入你的代码。换句话说,Appium & WebDriver 客户端在技术上而言不是「测试框架」,而是「自动化程序库」。你可以以任何你喜欢的方式管理你的测试环境!
我们以同样的方式实现理念#3:WebDriver 已经成为 Web 浏览器自动化事实上的标准,并且是一个 W3C 工作草案。何必在移动端做完全不同的尝试?我们通过附加额外的 API 方法 扩展协议,这些方法对移动自动化非常有用。
理念#4是明确已知的——你在阅读正是因为 Appium 是开源的。
Appium 的概念 客户端 / 服务器架构 Appium 的核心一个是暴露 REST API 的 WEB 服务器。它接受来自客户端的连接,监听命令并在移动设备上执行,答复 HTTP 响应来描述执行结果。实际上客户端 / 服务器架构给予了我们许多可能性:我们可以使用任何有 http 客户端 API 的语言编写我们的测试代码,不过选一个 Appium 客户端程序库 用起来更为容易。我们可以把服务器放在另一台机器上,而不是执行测试的机器。我们可以编写测试代码,并依靠类似 Sauce Labs 的云服务接收和解释命令。
会话(Session) 自动化始终在一个会话的上下文中执行,这些客户端程序库以各自的方式发起与服务器的会话,但最终都会发给服务器一个 POST /session 请求,请求中包含一个被称作「预期能力(Desired Capabilities)」的 JSON 对象。这时服务器就会开启这个自动化会话,并返回一个用于发送后续命令的会话 ID。
预期能力(Desired Capabilities) 预期能力(Desired Capabilities)是一些发送给 Appium 服务器的键值对集合(比如 map 或 hash),它告诉服务器我们想要启动什么类型的自动化会话。也有许多能力(Capabilities)可以修改服务器在自动化过程中行为。例如,我们可以将 platformName 能力设置为 iOS,以告诉 Appium 我们想要 iOS 会话,而不是 Android 或者 Windows 会话。或者我们也可以设置 safariAllowPopups 能力为 true ,确保我们在 Safari 自动化会话期间可以使用 JavaScript 打开新窗口。有关 Appium 能力的完整列表,请参阅 能力文档 。
Appium 服务器 Appium 是一个用 Node.js 写的服务器。可以从源码构建安装或者从 NPM 直接安装:
$ npm install -g appium $ appium Appium 的 beta 版本可以通过 NPM 使用 npm install -g appium@beta 指令进行安装。它是开发版本,所以可能存在破坏性的变更。在安装新版本请卸载 appium@beta (npm uninstall -g appium@beta)以获得一组干净的依赖。
Appium 客户端 有一些客户端程序库(分别在 Java、Ruby、Python、PHP、JavaScript 和 C# 中实现),它们支持 Appium 对 WebDriver 协议的扩展。你需要用这些客户端程序库代替常规的 WebDriver 客户端。你可以在这里浏览所有程序库的列表。
Appium Desktop 这有一个 Appium 服务器的图形界面封装可以下载,它适用于任何平台。它打包了 Appium 服务器运行需要的所有东西,所以你不需要为 Node 而烦恼。它们还提供一个 Inspector 使你可以查看应用程序的层级结构。这在写测试时可以派上用场。
获取DeviceName 打开命令行输入:adb devices -l model 就是设备的名称,前面的数字字母就是device name的一部分。 完整的Device name要加上品牌和型号:比如这台设备时huawei的,型号是MAR_AL00,device name就是huawei-MAR_AL00_5G05475c0005 获取包名&启动页名方法 方法1 命令:adb logcat | find “START” 1.启动需要测试的app 2.cmp即为包名和启动页名 命令返回值:{flg=0x10000000 hwFlg=0x10 cmp=com.eco.global.app/com.eco.main.activity.EcoMainActivity (has extras)} from uid 10352
方法2 获取包名方法: c:\Program Files (x86)\Android\android-sdk\build-tools\29.0.3> aapt dump badging D:\appium_learn\ECOVACS_HOME_2.1.1.apk | findstr package “appActivity”:“com.eco.main.activity.EcoLauncherActivity”,
获取启动页方法: C:\Program Files (x86)\Android\android-sdk\build-tools\29.0.3> aapt dump badging D:\appium_learn\ECOVACS_HOME_2.1.1.apk | findstr activity
获取app界面UI 方法1 使用appium自带工具,需要设置手机&app参数 “platformName”:"…" “platformVersion”:"…" “devicesName”:"…" “appPackage”:"…" “appActivity”:"…" “noReset":"…
方法2 uiautomator2工具
命令记录 什么都不做,程序暂停5s time.sleep(5)
跳转到其他应用 driver.start_activity(“com.huawei.smarthome”,".login.LauncherActivity")
出当前你程序的包名和界面名 print(driver.current_package) print(driver.current_activity)
关闭应用 driver.close_app() driver.quit()
判断程序是否安装 if driver.is_app_installed(“com.eco.global.app”): driver.remove_app(“com.eco.global.app”) else: driver.install_app(r"D:\appium_learn\ECOVACS_HOME_2.1.1.apk") driver.install_app("/data/app/com.eco.global.apphkvnCCXjpLdieVz81R442g==/base.apk") time.sleep(5)
元素定位方法 uiautomatorviewer右侧xml解释 8.1.ID定位(取resource-id的值): 无论是在web自动化还是app自动化中id都是唯一的,可能有的小伙伴看 到这里会有疑问,因为有的资料说是通过name定位是唯一的,为什么你这里是 id呢,其实这个在之前是不冲突的,但是如果你用的是appium较新版本是不行 的,在新版本中name定位被去掉了,所以在以后的定位中不会有name定位了, 通常情况下我们也更喜欢用id进行定位。这里可能刚学的小伙伴会有疑问, 有的时候你的应用为什么没有id,或者说在这个手机上有但是另外的手机上 没有。1、开发没有添加。2、android版本是4.4以下的。 如果我们需要对“7”这个数字进行点击操作, driver.find_element_by_id(“com.android.calculator2:id/digit7”).click()
8.3.className定位(取class的内容) 在实际工作中className定位用得相对而言会比较少。当你经常去看class 时你会发现很多的className是一样的,你没有办法对其进行唯一定位 这种方式去定位,你会发现你永远定位不了密码栏,这是为什么呢?因为在设计 的时候如果你查找的元素在页面有多个,系统会自动给你选择第一个,所以你永 远操作不了后面的
8.4.text定位(需要使用uiautomator的定位方式,使用text的内容) 使用这里需要注意一下,如果通过text定位的结果是个list,不能直接click。所 以如果要点击需要取数组的值,比如下面是点击找到的第一个元素 10.Appium操作界面之触摸操作 10.1.规范中的可用事件有: *短按(press) *释放(release) *移动到(moveTo) *点击(tap) *等待(wait) *长按(longPress) *取消(cancel) *执行(perform)
10.2.单点触摸TouchAction(driver) 通过TouchAction对象,添加tap、move_to等操作,然后perform()执行,可以 实现解锁屏幕等功能 action=TouchAction(driver) action.press(x=220,y=700).move_to(x=840,y=700).move_to(x=220, y=1530).move_to(x=840,y=1530).release().perform() 10.3.多点触控MultiAction() 通过MultiAction().add()添加多个TouchAction操作,最后调用perform()一起执行 这些操作 举例 action0=TouchAction().tap(el) action1=TouchAction().tap(el) MultiAction().add(action0).add(action1).perform() 10.4.滑动driver.swipe(x1,y1,x2,y2,duration) 命令解释:从坐标(x1,x2)滑动到坐标(x2,y2),duration非必填项,滑动时间(滑 动时中间要加等待时间,不加等待时间容易出错,而且加等待时间的长短也要掌 握好,一般在200-1000毫秒之间应该差不多,自己调试几次感觉一下哪个时间 比较稳,每个程序可能会有所差异) 滑动的坐标不能超过屏幕的宽高 可以通过【driver.get_window_size()】命令获得窗口高和宽{‘width’:1080,‘height’: 1788}
11.系统按键事件
press_keycode(AndroidKeyCode)#发送按键事件 例如:点击home键,home键的KeyCode是3 12.driver的一些比较重要操作 12.1.reset() #重置app#这时候driver会重置,相当于卸载重装应用。所以本地缓存会失效 driver.reset() 12.2.start_activity(包名,activity名) 例如: #启动app的某一个activity 启动一个activity,这个activity必须是AndroidManifest.xml中有intent-filter的 activity,对于其他的activity需要程序跳转过去
12.3.scroll(起始元素,结束元素)
driver.scroll(origin_el,destination_el)
12.4.获得当前页面的所有元素
driver.page_source
这可以用来判断元素是否存在,例如(assert“发布成功”indriver.page_source)
12.5.补充一些driver启动时可能用到的项 其实这些在上一篇启动里都有介绍,但是有些可能大家没注意到的点再列一下。 这些点也是我在测试中实际遇到的点 autoLaunch:Appium是否要自动启动或安装app,默认true desired_caps[‘autoLaunch’]=‘false’ 有的时候我不想让appium每次都启动app,想自己去启动activity,那这个项 这时就可以起作用了 noReset:在会话前是否重置app状态。默认是false desired_caps[‘noReset’]=‘true’ newCommandTimeout:设置未接收到新命令的超时时间,默认60s 如果60s内没有接收到新命令,appium会自动断开连接,如果我需要很长时间 做driver之外的操作,可能延长接收新命令的超时时间 desired_caps[“newCommandTimeout”]=1800
获取和设置手机网络 发送键到设备
应用退到后台再进入 driver.background_app(3)
|