Appium python自动化测试系列之认识Appium(四)

时间:2023-01-19 18:35:17

​4.1界面认识

在之前安装appium的时候说过我们有两种方法安装,也就有两种结果,一种是有界面的,一种是没有界面的,首先我们先讲一下有界面的,以及界面有哪些东西。

首先看第一幅图,如果你的是windows那么界面就应该是这样的,所以你发现你的和我的不一样也不用担心,正常。windows版整个界面只有7个按钮,我会按照从左到右从上到下的顺序讲。(mac的会有一定的差异,但并不是很大,只是排版和样式的问题,但是功能都一样。)

Appium python自动化测试系列之认识Appium(四)

Android Settings:左边的第一个按钮,主要是配置android的相关设置,他里面的结构图我们看下张图片

Appium python自动化测试系列之认识Appium(四)

Application Path:选择路径,选择需要测试的app在本电脑存放的一个路径。在启动appium时他会默认去该路径下去寻找这个app,然后将他安装到指定的手机上。

Package:之前提到过的,我们这个包的身份证,我们需要通过这个去找到包,不然我们安装后我们通过什么去辨别这些包呢?

Launch Activity:故名思义,启动的activity,activity的时候提到过,我们启动app时需要去运行的activity,这里我们填写首次启动页面的activity。

备注:这里需要注意一个问题在我们每次通过Choose选择apk后,appium会自动把这个包进行重新签名,那么在package以及activity里面会自动把包名和activity的名称列进去,但是这里会出现一个问题,每次选择apk后列表中会有一个缓存的原因,即使你更改了apk,但是package还是没有变,这样启动的时候就一直报错,遇见这样的情况不要着急,重新启动两次就好。

Wait for Activity: 和上面的差不多,意思是等待某个Activity打开,用的时间不是很多,做了解。

Launch Device:标签下面的东西用得相对比较少,后面大家可以去了解一下。

Capabilities:该标签下和我们做自动化关系很大,后面我们做自动化时如何配置启动app等信息就用的该标签下的数据。

Platform Name:我们测试的app的类型,ios选择ios,android选择Android就好。

Automation Name:测试引擎的名称,我们使用的是appium,所以你第一眼就能看见Appium,但是他还有一个Selendroid。可能看到这里会有一些疑惑,为什么appium要选择两套系统呢?其实这个应该追溯到android的版本问题,android自己的工具在4.2版本以前是一个,但是后面进行了更新,可能也正是因为这个原因appium也才采用了两套,所以当你测试的app安装的机器时在4.0或之前的版本时那么这里的引擎你就必须选择Selendroid,是否这样大家可以动手去试一试。检验真理的唯一标准就是自己动手尝试。

Platform Version:安装应用手机的版本号,android的是几点几的版本。

Device Name:设备名称。

备注:这里会有一个问题,如果你测试android时,只把一台手机插入到电脑,即使你输入的Device Name是错误的,但是你依然能够正常安装,使用。但是ios是不行的。不知道在设计的时候是否就是如此考虑的,如果在以后使用中遇见类似问题大家不要惊慌。

Advanced标签下的东西在初级阶段不用担心,这个标签只是在你想同一台电脑同时控制多台手机的时候才能使用,需要更改Bootstrap Port的端口号,记住这一点就好。

General Setting:

在General Setting里面在通常情况下我们使用默认设置就好,但还是有一些基础设置可以进行调整,方便后期的学习。整个页面分成了Server和log两部分,默认的情况如下面图片。

Appium python自动化测试系列之认识Appium(四)

Server Address:配置appium服务的地址,正常情况我们不需要更改,但是如果我们需要配置多台手机的时候启动了多个appium服务,那么这里的端口号我们需要进行调整,如果你多个都弄的同一个端口会报错。

Override Existing Session:session覆盖,可能对于初学者不理解什么叫session,你这里暂时理解为会话,我和你会话的唯一标示。

Log To File:默认状态是没有任何数据,但是在做自动化时建议选择,因为选择之后appium在运行时产生的日志都会保留到你设置的问题件,这个对后期的bug定位有相当大的帮助。切记!

开发者设置(左边第三个按钮)很少用,可以忽略。如果有兴趣可以作为兴趣了解一下。

关于(左边第四个按钮),查看当前appium的版本信息。

元素侦测(右边第二个按钮):这个按钮的功能和firebug的定位工具功能类似,但是他还有一个功能,他会检测你的各个系统配置是否正确,如果前面各项参数不正确时,使用该功能会报错。如果你不正常连接手机也不行。还是建议用sdk工具里面自带的uiautomatorviewer。

启动服务(右边第一个按钮):所有参数配置好后你需要做的就是启动appium服务,只有启动之后你才能够做自动化。

清除日志(右下角):在写脚本、调试过程中会产生很多的日志,但是你可能想看的只是中间某个时间段的,那么你在这个时候可以将页面的日志清除。

4.2 日志分析

通过前面的学习加上自己动手练习我相信很多小伙伴都能够将appium启动起来,并且会自动将app安装到手机或者模拟器,但是这个时候很多人看见appium的面板或者控制台会比较头疼。appium服务页面不断的在滚动日志,但是又看不懂,这个可能是通病。下面我们来分析一下这个日志,我们下面大概来解读一下我这个日志,让自己不再迷茫。在每一行的上面我来配置解读,让大家更容易理解。

我启动appium服务,指定了ip、端口、以及我的uid

192:~ ytxu$ appium -a 127.0.0.1 -p 4723 -U 127.0.0.1:62001

启动成功

[Appium] Welcome to Appium v1.6.3

[Appium] Non-default server args:

启动成功后的服务地址

[Appium]   address: ‘127.0.0.1'

我们的uid,因为我这里是链接的模拟器所以用的这个IP

[Appium]   udid: '127.0.0.1:62001'

[Appium] Deprecated server args:

系统自动拼接成字典的形式

[Appium]   -U,--udid => --default-capabilities '{"udid":"127.0.0.1:62001"}'

[Appium] Default capabilities, which will be added to each request unless overridden by desired capabilities:

[Appium]   udid: ‘127.0.0.1:62001'

REST http接口监听的是哪个端口

[Appium] Appium REST http interface listener started on 127.0.0.1:4723

通过POST的方式创建了一个session,这个session里面的值就是我们在配置app时的一些数据,这里系统把他自动转换成了字典的形式,一个key对应一个value。仔细去看你会发现都不陌生。

[HTTP] --> POST /wd/hub/session {"requiredCapabilities":{},"desiredCapabilities":{"deviceName":"127.0.0.1:62001","app":"/Users/ytxu/Desktop/AppiumPython/apps/mukewang.apk","autoLaunch":"true","platformVersion":"4.1","appPackage":"cn.com.open.mooc","platformName":"Android","appActivity":"cn.com.open.mooc.index.splash.MCSplashActivity"}}

[debug] [MJSONWP] Calling AppiumDriver.createSession() with args: [{“deviceName":"127.0.0.1:62001","app":"/Users/ytxu/Desktop/AppiumPython/apps/mukewang.apk","autoLaunch":"true","platformVersion":"4.1","appPackage":"cn.com.open.mooc","platformName":"Android","appActivity":"cn.com.open.mooc.index.splash.MCSplashActivity"},{},null,null,null]

创建一个会话,准备开始对话,把开始填写的数据,传入数据后用服务端验证,如果成功就会话开始。

[Appium] Creating new AndroidDriver session

[Appium] Capabilities:

[Appium]   deviceName: '127.0.0.1:62001'

[Appium]   app: '/Users/ytxu/Desktop/AppiumPython/apps/mukewang.apk'

[Appium]   autoLaunch: 'true'

[Appium]   platformVersion: '4.1'

[Appium]   appPackage: 'cn.com.open.mooc'

[Appium]   platformName: 'Android'

[Appium]   appActivity: 'cn.com.open.mooc.index.splash.MCSplashActivity'

[Appium]   udid: '127.0.0.1:62001'

[debug] [AndroidDriver] AndroidDriver version: 1.10.38

看到这里你是否还觉得这个很麻烦?其实只要你仔细去看你会很容易都了解的。可能这里会有小伙伴说这个启动的很容易,但是在实际中遇见的问题就没这么容易了,那么下面我们看一个实际遇见的问题,直接看日志:

debug] [ADB] We tried to start an activity that doesn't exist, retrying with . prepended to activity

[debug] [ADB] Device API level: 19

[debug] [ADB] Getting connected devices...

[debug] [ADB] 1 device(s) connected

[debug] [ADB] Running '/Users/ytxu/Library/Android/sdk/platform-tools/adb' with args: ["-P",5037,"-s","127.0.0.1:62001","shell","am","start","-W","-n","cn.com.open.mooc/.cn.com.open.mooc.aindex.splash.MCSplashActivity","-S","-a","android.intent.action.MAIN","-c","android.intent.category.LAUNCHER","-f","0x10200000"]

[ADB] Error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity

at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)

at ADB.callee$0$0$ (../../../lib/tools/apk-utils.js:68:13)

at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)

at GeneratorFunctionPrototype.invoke [as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)

at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)

at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)

Error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity

at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)

at ADB.callee$0$0$ (../../../lib/tools/apk-utils.js:68:13)

at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)

at GeneratorFunctionPrototype.invoke [as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)

at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)

at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)

[ADB] Error: Error occured while starting App. Original error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity

at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)

at ADB.callee$0$0$ (../../../lib/tools/apk-utils.js:80:9)

at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)

at GeneratorFunctionPrototype.invoke [as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)

at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)

at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)

Error: Error occured while starting App. Original error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity

at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)

从第一眼看见这个日志我知道大家的第一反应已经晕了,没事我们来仔细看。就日志的第一行说的大概意思就是“我们尽力去运行这个Activity了,但是他还是不存在。”那么看到这里小伙伴应该思考一个问题,在前面配置页面时就讲过如果你配置package或者activity错误那么是无法启动的。现在已经告诉我们说这个Activity不存在了是否应该去仔细检查一下呢?

其实在整个日志中我们应该直接去看error的部分,[ADB] Error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity,这是error的日志,给出的提示也是这个activity不能够被启动,让你再次确认后再去启动。

从这个小小的实验我们能够看出日志本身并不难,难的是我们没仔细看。所以以后遇见问题不要烦躁,应该仔细看日志,然后解决问题。

4.3 appium的工作原理

我们在去熟悉一套系统或者框架的时候,我们想去学好,我们是不是都要了解一下工作原理呢?只有我们知道了他是如何工作之后,在以后我们遇见棘手的问题时才能够从根本去解决问题。但是在讲这个之前需要讲一个题外话,不知道有谁思考过appium是如何实现自动化的吗?无论ios还是android在做自动化时考虑到安全等因素他们都是不允许直接去操作的,所以我们要做自动化那么就必须借助他们本身公布出来的一些工具,android是UIAutomator,ios使用的是UIAutomation,其实我们所谓的自动化就是我们使用的工具去调用他们公布出来的框架的方法,然后再去执行。下面我们来看一下appium的工作原理,首先来看一张图片。Appium python自动化测试系列之认识Appium(四)

通过上面的图片我们可以知道appium是基于WebDriver协议的,他利用Bootstrap调用google公布的android的自动化测试框架UIautomator的命令来实现我们的app自动化,再能理解一点就是我们的电脑(client)上运行自动化测试脚本,调用的是webdriver的接口,appium server接收到我们client上发送过来的命令后他会将这些命令转换为UIautomator认识的命令,然后由UIautomator来执行自动化。

可能这里有些小伙伴会迷糊,说android是这样那么ios也是这样吗?其实真的差不多,只是他们支持的工具不一样,ios使用的是UIAutomation,首先client发送脚本请求,再到我们的appium服务,这里appium会调用instruments去启动一个server,然后让他去执行后面的操作来完成自动化。备注:UIAutomation是instruments下面的一个工具,所以不要惊慌。

4.4 Appium的优势

现在市面上做自动化的框架无论是成熟还是一般的都有很多,我们不可能都去熟悉,但是我们需要了解一个常见的,不然你怎么知道好与坏呢?我相信在学习自动化时就想过为什么需要学appium,其实我在刚开始做移动自动化时选择的是robotium,但是后来因为项目的需要发现我如果只是用robotium发现ios根本没法做,那么我就需要去单独做一个,这个会很麻烦,这个时候appium刚好出来了,刚接触他我就决定使用了,因为在之前做web自动化时用的就是selenium,所以这个用起来会很方便。下面我们来列举一下他的优点:

1、可以同时支持android、ios

2、支持多种语言,java、python、php、Ruby等等

3、不用为复杂的环境发愁

4、如果你有selenium经验,直接上手

从上面来看他的优点还是很多的,当然缺点也有,这里不列举了,免得破坏美好的印象。

当看到这里的时候你对appium是否已经有一个模糊的影子了呢?接下来我们需要的就是去动手实战吧。