百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Appium 自动化测试

ztj100 2024-11-22 00:12 20 浏览 0 评论

Appium是什么

Appium是一款用于测试MobileApp的开源自动化测试框架。它是通过使用WebDriver[Facebook开源]协议来测试iOS,Android,WindowsApp的。WebDriver与Selenium有着千丝万缕的联系,很多方法的使用都很相似。

Appium支持多种语言。

>>Ruby

>>Python

>>Java

>>JavaScript

>>PHP

>>C#

>>Objective-C

根据先后顺序,官方的支持力度也不同。Ruby官方支持的最好(Appiumconsole就是使用Ruby开发的)。

Appium iOS测试环境搭建方法

Appium分为UI版本与命令行版本两种。不同在于UI版本的自带有图形界面,用户体验相对于命令行版本好。

常见依赖库的搭建

1.安装libimobiledevice

2.安装 appium-doctor

代码1:npm install appium-doctor -g

appium-doctor --ios // appium-doctor 安装完成后执行,查看 iOS 相关配置是否成功。如果存在红叉情况,安装对应的工具就可以了。

代码2:![appium_doctor_test.png](https://upload-images.jianshu.io/upload_images/2159939-f8cbccea99fc3bda.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

3.下载 WebDriverAgent

>>进入下载后的 WebDriverAgent 文件夹

>>执行 ./Scripts/bootstrap.sh

>>直接用Xcode打开 WebDriverAgent.xcodepro 文件

>>配置WebDriverAgentLib和WebDriverAgentRunner的证书

>>连接并选择自己的iOS设备,然后按Cmd+U,或是点击Product->Test

>>运行成功时,在Xcode控制台应该可以打印出一个Ip地址和端口号

命令行版本的搭建

1.安装 Appium

2.替换 WebDriverAgent

使用上面修改过的 WebDriverAgent 替换/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver 此处的WebDriverAgent

UI 版本的搭建

1.下载Appium Desktop

2.替换 WebDriverAgent

使用上面修改过的 WebDriverAgent 替换/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/ 此处的WebDriverAgent

开发环境搭建

1.安装 Appium Python 环境搭建

安装 Appium 的时候遇到的错误

  1. 未能载入软件包“WebDriverAgentRunner”,因为它已损坏或丢失必要的资源。 请尝试

2.AssertionError: Message: An unknown server-side error occurred while processing the command. Original error: Unknown device or simulator UDID: '*'

3.Could not initialize ios-deploy make sure it is installed (npm install -g ios-deploy) and works on your system

4.npm install -g ios-deploy 失败问题的解决方法

Appium 使用

Appium-Desktop 的使用

>>准备一个 ipa 或者 app 包。

>>运行Appium-Desktop

>>开启start server

>>点击start new session

>>在 Desired Capabilities 中输入相关的参数后点击Start Session

>>运行成功后,会弹出一个控制界面,在该界面中可以控制手机上正在运行的程序

>>点击界面上方中心的录制按钮,可以将你对手机端的操作代码化。生成的代码可以直接放入指定的代码中去执行。

>>在 UI 界面上我们可以查看App UI 层次结构,可以选择对应的控件。可以查看选中的 UI 控件的各种值(下图右下角所示),也可以对选中的空间进行点击,输入值,清空值操作

>>如上图所示。我们还可以针对需要使用坐标系统(不通用。因为不同的设备分辨率不同)点击,手势操作等。

关于在代码中如何使用 Appium

本例中使用 Python 为主要部分。

1.连接 Appium

path = "/Users/jack/Desktop/xx/xx/xx.ipa"

desired_caps = {

'app': os.path.abspath(path),

'platformName': 'iOS',

'platformVersion': '11.2.2',

'deviceName': 'iPad',

'udid': 'xxx',

'showIOSLog': 'true'

}

command_executor = 'http://127.0.0.1:4723/wd/hub'

appium_driver = webdriver.Remote(command_executor=command_executor, desired_capabilities=desired_caps)

```

**appium_driver** 就是我们需要的接入点。

2.获取当前页面层次结构

page_source 是 XML 文本。例子解析 XML 之后就可以看到整个页面的布局。

注意: 论坛中有说过当页面数据过多的时候,可能会出现超时错误问题。

3.查找指定的 UI 元素

查找 UI 元素的方式有很多种。

>>AccessibilityIdentifier 方式查找。推荐

>>AccessibilityIdentifier 方式查找。不推荐,但是必须的时候还是要用

4.获取查找到的控件的值

5.已经查找到的控件点击,输入值,清空值操作

6.长按操作

7.简单的手势滑动操作

8.等待页面消失

try:

# 在 60s 每隔 0.5s 检查是否 view 消失

WebDriverWait(driver, 60, 0.5, ElementNotVisibleException).until_not(lambda x: x.find_element_by_accessibility_id(view).is_displayed())

except TimeoutException, e:

print("time out message")

raise e

9.等待页面出现

try:

# 在 60s 每隔 0.5s 检查是否 view 出现

WebDriverWait(driver, 60, 0.5, ElementNotVisibleException).until(lambda x: x.find_element_by_accessibility_id(view).is_displayed())

except TimeoutException, e:

print("time out message")

raise e

iOS 设备获取对应的控件的方法

对于 iOS 端,WebDriver 使用了苹果提供的 Accessibility Inspector 来获取页面层次。因此,在编写代码的时候,需要设置

iOS 代码使用 Appium 建议条件满足isAccessibilityElement为 true。同时accessibilityIdentifier建议有值。这样查找的时候在编写代码会更加便捷。否则就需要如下的方式去查找:

driver.find_element_by_xpath("//XCUIElementTypeApplication[@name=\"LLL\"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeCollectionView/XCUIElementTypeCell")

上面的代码是去查找一个 tableview cell。当然我们可以使用 UI 工具获取到。但是当页面 ui 层次变更了,估计改动的时候会有想死的感觉了。

iOS 设备使用 Appium 的条件

  1. 运行 Mac 系统的电脑。
  2. 提供一个可以安装到真机上的 ipa 或者 app 包。
  3. Mac 系统建议安装 Xcode 环境。

iOS 设备使用 Appium 的限制

  1. 同一台电脑只能运行一个测试实例(没有研究出来多个测试)
  2. 测试 case 编写者必须清楚的知道自己在找什么,需要到哪里去找。
  3. Appium 只能针对已知的数据进行测试。对于未知的数据无法进行测试。例如:服务器端更新 server 的数据而没有通知 app 端。app 端仍然按照旧的数据去测试判断,就会出现错误。而这种错误不是 app 本身的错误。而由人测试的时候这里就会有主管判断为什么出现这种问题,中断去查找问题来源。
  4. 测试速度慢。目前来看可以接受
  5. 每次测试的时候都是重新安装 app。因此无法进行升级类的测试[对应的 install、uninstall api 不可用]
  6. 快速点击操作不可用,个别因为用户手速过快点击导致的问题会无法测试。因为Appium API 时延比较高。
  7. 设备横屏(在 iPad 上测试)的时候无法进行测试
  8. Scrollview/TableView/CollectionView 滚动的问题(swap 手势模拟有的时候很慢。一分钟都没反应完)。
  9. 关于通知推送,点击没有查到对应的测试资料。
  10. 内嵌,外部跳转 web 页面的测试没有验证过。
  11. Crash Log 以及运行时候的 log(设备的)无法收集。
  12. Emoji 表情输入没研究出来。目前看只能通过键盘点击达到这个效果,但是不方便。
  13. 因为时延较高,查找类页面在输入值的时候,应该清空页面显示,然后根据返回值显示。这部分不好测试。容易出现纰漏。

关于测试结果反馈

Appium 只是一款测试 Mobile 端 app 的框架。其本身的操作仅限于针对 App 进行测试,不具备生成测试结果,发送邮件等功能。如果想要该功能,需要在调用 Appium 的语言环境上思考。

由于 Demo 中使用的是 Python,因此使用 HTMLTestRunner 生成 html 格式的测试报告是最合适的方式。并且根据 Python 编程发送邮件给指定的用户。

  1. 在 case 中。如果断言错误,即已知结果不是想要的结果,可以使用断言使测试生成断言错误。这样就可以生成失败的测试 case 报告。
  2. 出现 Error 的时候有可能是由于 Python 代码本身不严谨造成的错误。因此当有 Error 错误的时候,首先考虑是否是 Python 代码的问题,其次考虑 App 错误。
  3. 没有错误,测试成功。

相关推荐

sharding-jdbc实现`分库分表`与`读写分离`

一、前言本文将基于以下环境整合...

三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么

在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...

MySQL8行级锁_mysql如何加行级锁

MySQL8行级锁版本:8.0.34基本概念...

mysql使用小技巧_mysql使用入门

1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...

MySQL/MariaDB中如何支持全部的Unicode?

永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...

聊聊 MySQL Server 可执行注释,你懂了吗?

前言MySQLServer当前支持如下3种注释风格:...

MySQL系列-源码编译安装(v5.7.34)

一、系统环境要求...

MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了

对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...

MySQL字符问题_mysql中字符串的位置

中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...

深圳尚学堂:mysql基本sql语句大全(三)

数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...

MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?

大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...

一文讲清怎么利用Python Django实现Excel数据表的导入导出功能

摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...

用DataX实现两个MySQL实例间的数据同步

DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...

MySQL数据库知识_mysql数据库基础知识

MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...

如何为MySQL中的JSON字段设置索引

背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...

取消回复欢迎 发表评论: