Appium+python自动化(八)- 认识Appium- 下章

news2025/6/9 20:18:16

1、界面认识

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

  首先看一下appium的外表,如果你的是windows系统那么界面就应该是这样的,所以当你发现你的和我的appium不一样也不用担心,各有不同”,但是正常windows版整个界面只有7个按钮,按照从左到右从上到下的顺序讲。此版本已经是最后一个版本了,此处我们只是学习,新旧版本我们暂时可以忽略~

目前官网已经不更新这种方式了,目前介意直接通过命令行安装服务器端,可以使用新的版本,当前官网的还是1.4.016版本这里只是为了介绍方便大家了解,使用了旧版本,原理是一样的

(mac的会有一定的差异,但并不是很大,只是排版和样式的问题,但是功能都一样。)

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

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

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

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

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

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

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

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

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

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

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

j.Device Name:设备名称。

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

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

2)General Setting:

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

        

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

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

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

3)开发者设置(左边第三个按钮,小人图标)很少用,可以忽略。

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

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

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

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

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

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

1 debug] [ADB] We tried to start an activity that doesn't exist, retrying with . prepended to activity
 2 
 3 [debug] [ADB] Device API level: 19
 4 
 5 [debug] [ADB] Getting connected devices...
 6 
 7 [debug] [ADB] 1 device(s) connected
 8 
 9 [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"]
10 
11 [ADB] Error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity
12 
13     at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
14 
15     at ADB.callee$0$0$ (../../../lib/tools/apk-utils.js:68:13)
16 
17     at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
18 
19     at GeneratorFunctionPrototype.invoke [as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
20 
21     at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
22 
23     at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
24 
25  Error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity
26 
27     at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
28 
29     at ADB.callee$0$0$ (../../../lib/tools/apk-utils.js:68:13)
30 
31     at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
32 
33     at GeneratorFunctionPrototype.invoke [as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
34 
35     at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
36 
37     at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
38 
39 [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
40 
41     at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
42 
43     at ADB.callee$0$0$ (../../../lib/tools/apk-utils.js:80:9)
44 
45     at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
46 
47     at GeneratorFunctionPrototype.invoke [as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
48 
49     at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
50 
51     at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
52 
53  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
54 
55     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不能够被启动,让你再次确认后再去启动。

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

3、 appium的工作原理

 下面我们来看一下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、Appium的优势

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

1、可以同时支持android、ios

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

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

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

从上面来看他的优点还是很多的,当然缺点也有,这里不列举了。

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

5、梳理

1、appium mac和windows下都有两种安装模式,一种是通过客户端安装,一个是终端安装,这里说一下区别:

做自动化肯定不可能只是在一台机器上做自动化,因为那样的意义并不是很大,所以很多时候我们都是链接多台电脑去执行,但是appium去链接多台电脑时就需要启动多个appium的服务,如果说你安装是通过客户端去安装的,你链接多台机器就需要启动多次,配置多次,这样对你电脑本身也是一个性能考验。如果你是通过终端命令安装的在启动的时候你只需要通过命令启动多个服务就好。这里为什么说这么多,就是因为曾经作者在做一个项目时统一体啊机器上appium客户端启动了5个,长期运行case后appium的服务会自动挂掉,但是通过终端安装启动超过10个服务,同时去运行依然没有问题。这是我的经历不一定全对。

appium客户端安装:

(1)去官方下载:http://appium.io/  比较慢,相比之下会慢一点;

现在安装包后直接傻瓜式的安装,一切下一步,默认即可。(windows也是一样)

appium终端安装:

直接在终端输入命令:npm install -g appium

(切记不要用sudo去执行) 在安装过程中不报错,你就安装成功了,报错也不要着急,可以百度解决。

appium命令安装默认的是在国外去请求,因为n多原因你失败了,建议使用如下命令 访问国内的镜像安装npm --registry http://registry.cnpmjs.org install -g appium 或者在你安装nodejs的时候就把仓库指定为国内的仓库,此时你在安装就会很快了

成功后输入appium会提示: Welcome to Appium 说明安装成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW的MathScript Node 绘图功能

该VI 借助 LabVIEW 的 MathScript Node,结合事件监听机制,实现基于 MathScript 的绘图功能,并支持通过交互控件自定义绘图属性。利用 MathScript 编写脚本完成图形初始化,再通过LabVIEW 事件结构响应用户操作,动态修改…

每日Prompt:治愈动漫插画

提示词 现代都市治愈动漫插画风格,现代女子,漂亮,长直发,20岁,豆沙唇,白皙,气质,清纯现代都市背景下,夕阳西下,一位穿着白色露脐短袖,粉色工装裤…

6.8 note

paxos算法_初步感知 Paxos算法保证一致性主要通过以下几个关键步骤和机制: 准备阶段 - 提议者向所有接受者发送准备请求,请求中包含一个唯一的编号。 - 接受者收到请求后,会检查编号,如果编号比它之前见过的都大,就会承…

面试心得 --- 车载诊断测试常见的一些面试问题

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

跟进一下目前最新的大数据技术

搭建最新平台 40C64G服务器,搭建3节点kvm,8C12G。 apache-hive-4.0.1-bin apache-tez-0.10.4-bin flink-1.20.1 hadoop-3.4.1 hbase-2.6.2 jdk-11.0.276 jdk8u452-b09 jdk8终于可以不用了 spark-3.5.5-bin-hadoop3 zookeeper-3.9.3 trino…

系统模块与功能设计框架

系统模块与功能设计框架,严格遵循专业架构设计原则,基于行业标准(如微服务架构、DDD领域驱动设计)构建。设计采用分层解耦模式,确保可扩展性和可维护性,适用于电商、企业服务、数字平台等中大型系统。 系统…

我爱学算法之—— 前缀和(中)

一、724. 寻找数组的中心下标 题目解析 这道题,给定数组nums,要求我们找出这个数组的中心下标。 **中心下标:**指左侧所有元素的和等于右侧所有元素的和。 如果存在多个中心数组下标,就返回最左侧的中心数组下标。 算法思路 暴…

Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程ES(三)

DSL官方地址: DSL查询分类 Elasticsearch提供了基于JSON的DSL(https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据&#xff0…

React Hooks 指南:何时使用 useEffect ?

在 React 的函数组件中,useEffect Hook 是一个强大且不可或缺的工具。它允许我们处理副作用 (side effects)——那些在组件渲染之外发生的操作。但是,什么时候才是使用 useEffect 的正确时机呢?让我们深入探讨一下! 什么是副作用…

API标准的本质与演进:从 REST 架构到 AI 服务集成

在当今数字化浪潮中,API 已成为系统之间沟通与协作的“语言”,REST(Representational State Transfer,表述性状态转移)是一种基于 HTTP 协议的 Web 架构风格。它不仅改变了 Web 应用开发的方式,也成为构建现…

html - <mark>标签

<mark> 标签在HTML中用于高亮显示文本&#xff0c;通常用于突出显示某些重要的部分。它的默认样式通常是背景色为黄色&#xff0c;但你可以通过CSS自定义其外观。 1. 基本用法 <mark> 标签用于标记文本的高亮显示。它常用于搜索结果中&#xff0c;突出显示匹配的…

JavaWeb:前端工程化-Vue

Vue工程化 介绍 什么是Vue? 小白眼里前端开发 前端工程化 环境准备 D:\Program Files\nodejs Vue项目-快速入门 步骤 D:\front\vue 安装依赖 目录结构 code . vscode打开 启动 VScode侧边栏左下角&#xff0c;没有NPM脚本&#xff0c;如何打开&#xff1f;&…

AT_abc409_e [ABC409E] Pair Annihilation

AT_abc409_e [ABC409E] Pair Annihilation 赛时没开longlong挂了。 思路 首先我们可以把这棵树转化为一颗有根树&#xff0c;且所有电子的都朝根节点移动。 那么接下来我们就需要选择一个最优的树根。 考虑换根dp。 但是可以发现换根时答案其实是没有变化的。 我们设 f…

开疆智能Ethernet/IP转Modbus网关连接西门子BW500积算仪配置案例

本案例是通过Ethernet转Modbus网关将皮带秤数据接入到罗克韦尔1769L32E型PLC中。 首先进行ABB PLC的设置 1&#xff0c; 运行 RSLogix 5000 程序加载Ethernet转Modbus网关的EDS 文件&#xff1a; 2&#xff0c;新建工程并添加PLC 3&#xff0c;New Module添加网关&#xff…

【五子棋在线对战】三.数据管理模块实现

数据管理模块实现 1.数据库表的设计2.数据管理模块的封装和实现2.1 user_table() && ~user_table()2.2 insert() 注册时新增用户2.3 login() 登录验证&#xff0c;并返回详细的用户信息2.4 通过用户名获取用户信息 && 通过用户id获取用户信息2.5 win() &&a…

【JMeter】后置处理器 - 提取器

文章目录 概览边界提取器正则提取器JSON提取器 概览 CSS/JQuery提取器&#xff1b;给网页使用JSON提取器&#xff1a;给JSON数据使用★边界提取器&#xff1a;给字符串使用★正则表达式提取器&#xff1a;更加高级的字符使用★Xpath提取器&#xff1a;给网页使用 边界提取器…

OpenAI技术路线急转:从TypeScript到Rust的Codex CLI重构内幕

目录 前言&#xff1a;OpenAI的技术抉择引发业界思考 Codex CLI&#xff1a;OpenAI的终端AI编程利器 语言抉择的戏剧性反转&#xff1a;从TypeScript到Rust Rust重写的四大技术动因 1. 零依赖部署&#xff1a;消除环境配置痛点 2. 内存安全与沙箱隔离 3. 性能的全面碾压 …

window下配置ssh免密登录服务器

window下配置ssh免密登录服务器 本地windows远程登录我的ssh服务器10.10.101.xx服务器&#xff0c;想要每次都免密登录这个服务器. 记录下教程&#xff0c;防止后期忘记&#xff0c;指导我实现这个过程。 教程 二、实践步骤&#xff1a;Windows 上配置 SSH 免密登录 2.1 确…

nginx部署

配置阿里云yum源 安装如下编译工具 yum install -y gcc gcc-c autoconf automake make #安装使用nginx还得安装nginx所需的一些第三方系统库的支持&#xff0c;比如nginx的静态资源压缩功能所需的gzip lib库&#xff0c;nginx需要支持URL重写&#xff0c;所需的pcre库&…

线性规划饮食问题求解:FastAPI作为服务端+libhv作为客户端实现

之前在 Pyomo介绍-CSDN博客 中介绍过通过Pyomo求解线性规划问题&#xff0c;这里使用FastAPI作为服务端&#xff0c;开源网络库libhv作为客户端&#xff0c;求解饮食成本最小化问题。 服务端测试代码test_fastapi_pyomo_server.py如下&#xff1a; from fastapi import FastAP…