浅谈Appium

浅谈Appium

十一月 02, 2019

关于目前我所使用的自动化工具中,Appium应该是在做移动端自动化的时候最常使用的一个了,可以说是一个很强大的开源工具了,不过涉及到驱动的内核知识仍旧需要学习和探索(扶我起来~我还能学😆)

咳咳~~ 言归正传,下面来梳理一下Appium的相关知识吧。

一、简单介绍

(一)测试对象

Appium是一款开源的自动化测试框架,支持iOS和Android平台上的原生应用,web应用和混合应用。

  • 移动原生应用:单存用iOS或Android开发语言开发编写的应用,简单来说就是App Store或者Google Play里面的应用,例如一些App(Application的简称),可以直接安装在移动设备的应用。
  • 移动Web应用:在移动端设备上通过浏览器访问的应用(Appium目前已支持Android的Chrome和iOS的Safari),这类应用往往通过浏览器就可以访问,比如一些页游或者一些网页插件应用。
  • 混合应用:同时使用网页语言与程序语言开发,原生代码和 Web 内容交互的应用,举个例子来说就是很熟悉的淘宝,京东这类应用,既有Web端又有移动端。

(二)支持平台及语言

  • Appium是跨平台的,支持Windows,Linux和OSX系统,它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化的测试脚本,这大大提高了iOS和Android测试套件间代码的复用性。
  • Appium支持多语言编写,目前支持Java,JavaScript,PHP,Python,Ruby等几款语言并有完整的支持,具体可以看多种不同语言的测试示例。Appium是C/S的设计模式,只要Client能够发送http请求给server,那么的话Client用什么语言来实现都是可以的,这就是Appium及Selenium(WebDriver)如何做到支持多语言的原因;Appium扩展了WebDriver的协议,没有自己重新去实现一套。这样的好处是以前的WebDriver API能够直接被继承过来,以前的Selenium(WebDriver)各种语言的Building都可以拿来就用,省去了为每种语言开发一个Client的工作量。
语言/框架 Github地址
Python Python样例
Ruby Ruby样例
Java Java样例
JavaScript(Node.js) JavaScript样例
RobotFrameWork RobotFrameWork样例
PHP PHP样例

(三)Appium哲学

Appium的官方介绍文档中写到了有关Appium的四条哲学,原文是这样写的:

Appium Philosophy

Appium was designed to meet mobile automation needs according to a philosophy outlined by the following four tenets:

  1. You shouldn’t have to recompile your app or modify it in any way in order to automate it.
  2. You shouldn’t be locked into a specific language or framework to write and run your tests.
  3. A mobile automation framework shouldn’t reinvent the wheel when it comes to automation APIs.
  4. A mobile automation framework should be open source, in spirit and practice as well as in name!

下面是中文翻译:

Appium根据以下四个原则概述的理念来满足移动自动化需求:

  1. 您无需重新编译或以任何方式对其进行修改即可使其自动化。
  2. 您不应该被锁定在特定的语言或框架中来编写和运行测试。
  3. 当涉及到自动化API时,移动自动化框架不应重新发明轮子。
  4. 移动自动化框架应该在精神,实践和名称上都是开源的!

这四个原则统一来说都在说明Appium的开源性,灵活性以及强大的可扩展性,这让它成为了一款强大的测试框架。

(四)Appium的工作原理

画图花了10分钟,下图展示了Appium的工作原理图:

(该图是参考了网上的资料以及个人的一些理解后的出,如有错误之处,欢迎指正)

我们编写的自动化脚本作为Client端,Client端以特定以针对每种语言的库的方式启动Appium-Server的会话(session),但是它们最终都通过一个POST/SESSION称为“desired capabilities”对象的Json对象想服务器发送请求,此时,服务器将启动自动化会话并以会话ID进行响应,该会话ID用于发送其他命令。

在Server端,Appium针对Mac和Windows两大平台开发了对应的Appium-Server。

Appium-Server通过调用不同的接口来驱动Apk/Ipa的操作,针对Android设备,Android SDK 版本在17以上的会通过调用Android 系统 UIAutomator 组件的接口来实现相应操作,SDK版本在17以下会通过调用Android系统Senlendroid组件的接口来实现相应操作;针对IOS设备,则通过调用IOS系统Apple Instruments组件的接口来实现相应操作的。

最后在不同的系统设备上执行自动化的操作,所支持的设备包括真机和一些模拟器。整个Appium的执行过程原理作为刚入行业不久的新人也暂时只能理解到这里了,之前在网上浏览资料的时候曾了解到Appium一些底层的驱动原理,但无奈知识体系的深度1不够并没有完全看懂,总而言之,还是得多用多学多理解。

(五)需要安装的工具

1.首先就是我们用来编写自动化脚本的测试语言了,博主目前使用的是Python,以及每个语言所需要依赖的相关库需要自己去了解学习了。

2.有了编程语言,你必须就得有一个用于“搬砖”(写代码)的IDE,这里博主使用的是pycharm,因为Pycharm对于python依赖库的安装太简单快速了,以及和GIt的联结代码上传功能可以不用在敲命令无缝上传Github,感觉自己在吹水了哈….咳咳,收!这个根据个人喜好不同,都会有不同选择。唯一原则:用着顺手就好。

3.下载Appium-Server端,在下面的环境搭建中会讲到。

4.下载Appium-Client端,在下面的环境搭建中会讲到。

5.你所要测试的移动设备,可以是真机也可以是模拟器,这里模拟器推荐可以参考博主之前的文章中提到的几款模拟器。

二、环境搭建

(一)安装Android SDK

1、Android SDK(Software Development Kit,软件开发工具包)提供了 Android API 库和开发工具构建,测试和调试应用程序,可以看做用于开发和运行Android应用的一个软件
2、提供小工具,比如adb、aapt、uiautomatorview
3、测试设备使用安卓模拟器,这一步决不能跳过

(二)安装Appium-Server

1、下载地址:https://github.com/appium/appium-desktop/releases
2、下载appium安装包(Appium-windows-1.15.1.exe,Appium-mac-1.15.1.dmg等)
3、安装appium-desktop,并配置appium环境变量

(三)安装Appium-Client

1、先安装编程语言,比如python语言
2、安装Appium-Client,python的话可使用pip安装:pip install Appium-Python-Client

三、应用及操作

(一)调用Appium过程

1、配置手机设备参数,告诉server端我想调起的是哪一台手机设备
2、抓取手机上应用的控件,指定对应的控件来进行操作
3、对抓取到的控件进行操作,比如点击、填写参数等

(二)配置手机设备参数

Appium的Desired Capabilities的基本配置如下:

这里楼主选择的是Page-Object的代码框架模式,做了一些逻辑与数据的分离,将配置信息分离,以yaml脚本的形式进行信息记录,这样的记录方式的好处就是将数据与业务逻辑分离开来,无论是在数据上还是代码逻辑上做修改,都很清晰且容易维护,方便修改配置信息等。

下面是配置信息的yaml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
platformName: Android
#模拟器
platformVersion: 8.1.0 (Android系统)
deviceName: 127.0.0.1:62001 (设备名称,可以用adb devices命令查看)
appname: 你的apk文件
noReset: False
unicodeKeyboard: True
resetKeyboard: True
appPackage: com.demo.test (你的应用包名)
appActivity: com.demo.launcher.LauncherActivity (你的应用启动Activity)
#这里说一下,获取appPackage和appActivity的方法是通过下面的一个命令可以获取到:
# 在终端输入 aapt dump badging | grep "你的apk文件路径" 就可以了。
ip: 127.0.0.1
port: 4723

下面是python脚本对yaml文件的引用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from appium import webdriver
import yaml

def appium_desired():
with open('你的yaml文件地址','r',encoding='utf-8') as file:
data = yaml.load(file)

desired_caps = {}
desired_caps['platformName'] = data['platformName']
desired_caps['platformVersion'] = data['platformVersion']
desired_caps['deviceName'] = data['deviceName']

base_dir = os.path.dirname(os.path.dirname(__file__))
app_path = os.path.join(base_dir, 'app', data['appname'])
desired_caps['app'] = app_path

desired_caps['appPackage'] = data['appPackage']
desired_caps['appActivity'] = data['appActivity']
desired_caps['noReset'] = data['noReset']

desired_caps['unicodeKeyboard'] = data['unicodeKeyboard']
desired_caps['resetKeyboard'] = data['resetKeyboard']

logging.info('start app...')
driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(data['port']) + '/wd/hub', desired_caps)
driver.implicitly_wait(8)
return driver

if __name__ == '__main__':
appium_desired()

上图是以Android设备为例,iOS设备大同小异,解释一下几个常见的参数吧:

● deviceName:指定启动设备,比如Android Emulator、iPhone Simulator等
● automationName:指定自动化引擎,默认appium
● platformName:指定移动平台,Android或者iOS
● platformVersion:指定平台的系统版本。例如指定Android系统版本为8.1.0
● appActivity:待测试app的Activity,注意,原生app的话要在activity前加个“.”
● appPackage:待测试app的包名(package)信息

(三)抓取手机上的应用控件

抓取方法一:通过Android SDK内置工具uiautomatorviewer.bat来查看手机应用的控件参数(该工具位于 /tools/bin/ 目录下)

这是Android SDK自带的工具,使用还是很方便的,就是在连接上针对一些应用会不太稳定。

抓取方法二:使用appium-desktop自带的客户端进行抓取。

抓取方法三:使用weditor进行元素抓取(浏览器界面)

weditor的Github地址:https://github.com/openatx/weditor 具体介绍了weditor的安装以及如何使用。

总结:目前来说博主用的最多的就是weditor的元素定位了,及其的方便以及查看的信息很多,还可以录制脚本运行自动化(虽然我从来没用过,只是用来定位元素😆),有时候也会使用appium-desktop来查看,三种元素定位的方法任你选择了,罗卜白菜,各有所爱嘛,啥有的顺手用啥。

(四)操作控件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
1.scroll  
scroll(self, origin_el, destination_el):
#从元素origin_el滚动至元素destination_el
举例:driver.scroll(el1, el2)
用法:driver.scroll(el1,el2)

2.tap
tap(self, positions, duration=None):
#模拟手指点击(最多五个手指),可设置按住时间长度(毫秒)
举例:driver.tap([(100, 20), (100, 60), (100, 100)], 500)
用法:driver.tap([(x,y),(x1,y1)],500)

3. swipe
swipe(self, start_x, start_y, end_x, end_y, duration=None):
#从A点滑动至B点,滑动时间为毫秒
举例:driver.swipe(100, 100, 100, 400)
用法:driver.swipe(x1,y1,x2,y2,500)

4. keyevent
keyevent(self, keycode, metastate=None):
#发送按键码(安卓仅有),按键码可以上网址中找到
用法:driver.keyevent(‘4’)

5. press_keycode
press_keycode(self, keycode, metastate=None):
#发送按键码(安卓仅有),按键码可以上网址中找到
用法:driver.press_ keycode(‘4’)

6.text
text(self):
#返回元素的文本值
用法:element.text

7.click
click(self):
#点击元素
用法:element.click()

8.get_attribute
get_attribute(self, name):
#获取某元素的相关值
用法:element.get_attribute(“name”)

9.size
size(self):
#获取元素的大小(高和宽)
用法 driver.element.size

10. page_source
page_source(self):
#获取当前页面的源
用法:driver.page_source

11.quit
quit(self):
#退出脚本运行并关闭每个相关的窗口连接
举例:driver.quit()

上面列举了最基本的一些操作代码了,涉及到一些深度的操作还是得自己封装函数,这个就要看所要实现的操作是什么了。

四、个人总结

1.Appium适合做什么样的测试呢?答:适合做UI自动化的测试,但是还是会存在驱动较慢的情况。

2.Appium跨平台,支持Android和IOS自动化测试。

3.Appium支持多语言,如java、Object-C、JavaScript、PHP、Python、Ruby、C#等等。

4.Appium的开源以至于支持多种应用:原生应用,Web应用和混合应用。

5.Appium是目前我所使用来做UI自动化比较顺手的工具了,还有其他类似的工具,比如网易的Airtest,博主也搞来折腾过,确实也是很便利,对于小白来说是个不错的工具,用于游戏APP的脚本录制真的简单快捷,自动化这一块水很深,还是得慢慢学习了解。

好了,以上就是我对Appium知识的一些梳理了。立个Flag:希望有一天能把Appium的底层吃透,能够自己写一些辅助性工具😆。