手机APP自动化 Appium教程

手机APP自动化 Appium教程Appium原理与安装Appium是一个移动App(手机应用)自动化工具。手机APP自动化有什么用?自动化完成一些重复性的任务比如微信客服机器人爬虫自动化测试Appium自动化方案的特点:开源免费支持多个平台支持多种类型的自动化支持多种编程语言自动化原理我们先来看一下Appium自动化的原理图这图是不是很眼熟?对啦,和Selenium原理图很像。因为Appium自动化架构就是借鉴的Selenium。大家看看这幅图,包含了3个主体部分:自动化程序

大家好,又见面了,我是你们的朋友全栈君。

Appium原理与安装

Appium 是一个移动 App (手机应用)自动化工具。

手机APP 自动化有什么用?

  • 自动化完成一些重复性的任务
  • 比如微信客服机器人
  • 爬虫
  • 自动化测试

Appium 自动化方案的特点:

  • 开源免费
  • 支持多个平台
  • 支持多种类型的自动化
  • 支持多种编程语言

自动化原理

我们先来看一下Appium自动化的原理图

在这里插入图片描述
这图是不是很眼熟?

对啦,和Selenium 原理图很像。因为 Appium自动化架构就是借鉴的Selenium。

大家看看这幅图, 包含了 3个主体部分 : 自动化程序、Appium Server、移动设备

  • 自动化程序

    自动化程序是由我们来开发的,实现具体的 手机自动化 功能。

    要发出具体的指令控制手机,也需要使用 客户端库。

    和Selenium一样,Appium 组织 也提供了多种编程语言的客户端库,包括 java,python,js, ruby等,方便不同编程语言的开发者使用。

    我们需要安装好客户端库,调用这些库,就可以发出自动化指令给手机。

  • Appium Server

    Appium Server 是 Appium 组织开发的程序,它负责管理手机自动化环境,并且转发 自动化程序的控制指令 给 手机,并且转发 手机给 自动化程序的响应消息。

  • 手机设备

    我们这里说的手机设备,其实不仅仅是手机,包括所有 苹果、安卓的移动设备,比如:手机、平板、智能手表等。

    为了直观方便的讲解,这里我们简称: 手机

    当然手机上也包含了 我们要自动化控制的 手机应用APP。

    手机设备为什么能 接收并且处理自动化指令呢?

    因为,Appium Server 会在手机上 安装一个 自动化代理程序, 代理程序会等待自动化指令,并且执行自动化指令

    比如:要模拟用户点击界面按钮,Appium 自动化系统的流程是这样的:

  • 自动化程序 调用客户端库相应的函数, 发送 点击元素 的指令(封装在HTTP消息里)给 Appium Server

  • Appium Server 再转发这个指令给 手机上的自动化代理

  • 手机上的自动化代理 接收到 指令后,调用手机平台的自动化库,执行点击操作,返回点击成功的结果给 Appium Server

  • Appium Server 转发给 自动化程序

  • 自动化程序了解到本操作成功后,继续后面的自动化流程

其中,自动化代理控制,使用的什么库来实现自动化的呢?

如果测试的是苹果手机, 用的是苹果的 XCUITest 框架 (IOS9.3版本以后)

如果测试的是安卓手机,用的是安卓的 UIAutomator 框架 (Android4.2以后)

这些自动化框架提供了在手机设备上运行的库,可以让程序调用这些库,像人一样自动化操控设备和APP,比如:点击、滑动,模拟各种按键消息等。

自动化环境搭建

本教程主要讲解 安卓APP的自动化。

环境搭建需要下载安装不少软件,而且还有不少是国外网站下载的。

为了方便各位朋友,博主把这些软件 最新的安装包 都放在如下的csdn资源中了,请大家自行下载。

链接:https://download.csdn.net/download/m0_50944918/14827713

安装client编程库

根据原理图, 我们知道自动化程序需要调用客户端库和 Appium Server 进行通信。

因为我们介绍Python语言开发,所以当然是用pip安装,如下

pip install appium-python-client

pycharm用户可以设置里安装

安装Appium Server

Appium Server 是用 nodejs 运行的,基于js开发出来的。

Appium组织为了方便大家安装使用,制作了一个可执行程序 Appium Desktop,把 nodejs 运行环境、Appium Server 和一些工具 打包在里面了,只需要简单的下载安装就可以了。

可以从 上面给出的链接地址 下载安装: Appium-windows-1.15.1.exe

官方下载地址点这里

安装JDK

本教程主要讲解 安卓APP的自动化,必须要安装安卓SDK(后面会讲到),而安卓SDK需要 JDK 环境。

可以从 上面给出的链接地址 下载安装: jdk-8u211-windows-x64.exe

加粗样式
安装好之后,还需要添加一个环境变量 JAVA_HOME ,指定 值 为 jdk安装目录,比如

JAVA_HOME   d:\tools\java\jdk1.8.0_211

安装 Android SDK

对于安卓APP的自动化,Appium Server 是需要 Android SDK的。

因为要用到里面的一些工具,比如 要执行命令设置手机、传送文件、安装应用、查看手机界面等。

可以从 上面给出的链接地址 下载最新的 Android SDK文件包: androidsdk.zip ,并且解压,即可。

解压完成后,需要 配置一下 添加一个 环境变量 ANDROID_HOME ,设置值为sdk包解压目录,比如 d:\tools\androidsdk

另外,还推荐大家配置环境变量 PATH ,加入 adb所在目录, *d:\tools\androidsdk\platform-tools*

注意:是 添加 该目录到环境变量PATH中, !!!不是替换!!! ,否则会导致系统命令都找不到的严重后果,初学者 请对照视频讲解操作。

连接手机

上述的软件环境都准备好以后,要自动化手机APP,需要:

在你运行程序的电脑上 用 USB线 连接上 你的安卓手机

进入 手机设置 -> 关于手机 ,不断点击 版本号 菜单(7次以上),

退出到上级菜单,在开发者模式中,启动USB调试

如果手机连接USB线后,手机界面弹出 类似 如下提示。

在这里插入图片描述
选择 允许USB调试。

注意:

有的手机系统,可能需要一些额外的选项需要设置好。

比如,有的手机,开发者选项里 需要打开 允许通过USB安装应用 等。

总之,给USB开发调试 尽可能方便的控制手机。

连接好以后,打开命令行窗口, 执行 adb devices -l 命令来列出连接在电脑上的安卓设备。

如果输出 类似如下的内容:

List of devices attached
4d0035dc767a50bb        device product:t03gxx model:GT_N7100 device:t03g

表示电脑上可以查看到 连接的设备,就可以运行自动化程序了。

一个例子

打开csdn的APP 点搜索

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/1/18 19:11
# @Author : huni
# @File : APP.py
# @Software: PyCharm
from appium import webdriver
from appium.webdriver.extensions.android.nativekey import AndroidKey
from time import sleep

desired_caps = { 
   
  'platformName': 'Android', # 被测手机是安卓
  'platformVersion': '10', # 手机安卓版本
  'deviceName': 'xxx', # 设备名,安卓手机可以随意填写
  'appPackage': 'net.csdn.csdnplus', # 启动APP Package名称
  'appActivity': '.activity.SplashActivity', # 启动Activity名称
  'unicodeKeyboard': True, # 使用自带输入法,输入中文时填True
  'resetKeyboard': True, # 执行完程序恢复原来输入法
  'noReset': True,       # 不要重置App
  'newCommandTimeout': 6000,
  'automationName' : 'UiAutomator2'
  # 'app': r'd:\apk\bili.apk',
}

# 连接Appium Server,初始化自动化环境
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
sleep(4)
driver.find_element_by_class_name('android.widget.TextView').click()
sleep(5)
driver.quit()


运行代码前,要先 运行 Appium Desktop

查找 应用 Package 和 Activity

没有apk:
如果你应用已经安装在手机上了,可以直接打开手机上该应用,进入到你要操作的界面

然后执行

adb shell dumpsys activity recents | find "intent={"

会显示如下,最近的 几个 activity 信息,

intent={ 
   act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=tv.danmaku.bili/.ui.splash.SplashActivity}
intent={ 
   act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000300cmp=com.huawei.android.launcher/.unihome.UniHomeLauncher}
intent={ 
   flg=0x10804000 cmp=com.android.systemui/.recents.RecentsActivity bnds=[48,1378][10322746]}
intent={ 
   flg=0x10000000 cmp=com.tencent.mm/.ui.LauncherUI}

有apk:
如果你已经获取到了 apk,在命令行窗口执行

d:\tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging d:\tools\apk\bili.apk | find "package: name="

输出信息中,就有应用的package名称

package: name='tv.danmaku.bili' versionCode='5531000' versionName='5.53.1' platformBuildVersionName='5.53.1' compileSdkVersion='28' compileSdkVersionCodename='9'

在命令行窗口执行

d:\tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging d:\tools\apk\bili.apk | find "launchable-activity"

输出信息中,就有应用的启动Activity

launchable-activity: name='tv.danmaku.bili.ui.splash.SplashActivity'  label='' icon=''

定位元素

代码规则:

从示例代码,大家就可以发现,和Selenium Web自动化一样,要操作界面元素,必须先 定位(选择)元素。

Appium是基于Selenium的,所以 和 Selenium 代码 定位元素的 基本规则相同:

find_element_by_XXX 方法,返回符合条件的第一个元素,找不到抛出异常

find_elements_by_XXX 方法,返回符合条件的所有元素的列表,找不到返回空列表

通过 WebDriver 对象调用这样的方法,查找范围是整个界面

通过 WebElement 对象调用这样的方法,查找范围是该节点的子节点

界面元素查看工具

做 Selenium Web 自动化的时候,要找到元素,我们是通过浏览器的开发者工具栏来查看元素的特性,根据这些特性(属性和位置),来定位元素

Appium 要自动化手机应用,同样需要工具查看界面元素的特征。

常用的查看工具是: Android Sdk包中的 uiautomateviewerAppium Desktop 中的 Appium Inspector

uiautomateviewer

安卓查看APP界面元素,最常用的就是 Android SDK 中的工具 uiautomateviewer ,它在SDK目录目录 的 tools\bin 目录中

和Selenium一样,我们要定位选择元素,也是根据元素的特征,包括

  • 元素的属性
  • 元素的相对位置(相对父元素、兄弟元素等)

Appium Inspector

Appium Desktop 中的 Appium Inspector 也可以查看元素。

它的一个优点是可以直接验证 选择表达式是否能定位到元素

参考视频里面的讲解。

定位元素的方法

根据ID

在Selenium Web自动化教程里,我们说过,如果能根据ID选择定位元素,最好根据ID,因为通常来说ID是唯一的,所以根据ID选择 效率高。

在安卓应用自动化的时候,同样可以根据ID查找。

但是这个ID ,是安卓应用元素的 resource-id 属性

使用如下代码

driver.find_element_by_id('expand_search')

根据CLASS NAME

安卓界面元素的 class属性 其实就是根据元素的类型,类似web里面的tagname, 所以通常不是唯一的。

通常,我们根据class 属性来选择元素, 是要选择多个而不是一个。

当然如果你确定 要查找的 界面元素的类型 在当前界面中只有一个,就可以根据class 来唯一选择。

使用如下代码

driver.find_elements_by_class_name('android.widget.TextView')

根据ACCESSIBILITY ID

元素的 content-desc 属性是用来描述该元素的作用的。

如果要查询的界面元素有 content-desc属性,我们可以通过它来定位选择元素。

使用如下代码

driver.find_element_by_accessibility_id('找人')

Xpath

Appium 也支持通过 Xpath选择元素。

但是其可靠性和性能不如 Selenium Web自动化。因为Web自动化对Xpath的支持是由浏览器实现的,而Appium Xpath的支持是 Appium Server实现的。

毕竟,浏览器产品的成熟度比Appium要高很多。

当然,Xpath是标准语法,所以这里表达式的语法规则和 以前学习的Selenium里面Xpath的语法是一样的,比如

driver.find_element_by_xpath('//ele1/ele2[@attr="value"]')

注意:

selenium自动化中, xpath表达式中每个节点名是html的tagname。

但是在appium中, xpath表达式中 每个节点名 是元素的class属性值。

比如:要选择所有的文本节点,就使用如下代码

driver.find_element_by_xpath('//android.widget.TextView')

安卓 UIAutomator

根据id,classname, accessibilityid,xpath,这些方法选择元素,其实底层都是利用了安卓 uiautomator框架的API功能实现的。

参考 这里的谷歌安卓官方文档介绍:https://developer.android.google.cn/training/testing/ui-automator

也就是说,程序的这些定位请求,被Appium server转发给手机自动化代理程序,就转化为为uiautomator里面相应的定位函数调用。

其实,我们的自动化程序,可以直接告诉 手机上的自动化代理程序,让它 调用UI Automator API的java代码,实现最为直接的自动化控制。

主要是通过 UiSelector 这个类里面的方法实现元素定位的,比如

code = 'new UiSelector().text("热门").className("android.widget.TextView")'
ele = driver.find_element_by_android_uiautomator(code)
ele.click()

就是通过 text 属性 和 className的属性 两个条件 来定位元素。

UiSelector里面有些元素选择的方法 可以解决 前面解决不了的问题。

比如

  • text 方法

    可以根据元素的文本属性查找元素

  • textContains

    根据文本包含什么字符串

  • textStartsWith

    根据文本以什么字符串开头

  • textmartch 方法

    可以使用正则表达式 选择一些元素,如下

    code = 'new UiSelector().textMatches("^我的.*")'
    

UiSelector 的 instance 和 index 也可以用来定位元素,都是从0开始计数, 他们的区别:

  • instance是匹配的结果所有元素里面 的第几个元素

  • index则是其父元素的几个节点,类似xpath 里面的*[n]

UiSelector 的 childSelector 可以选择后代元素,比如

code = 'new UiSelector().resourceId("tv.danmaku.bili:id/recycler_view").childSelector(new UiSelector().className("android.widget.TextView"))'

ele = driver.find_element_by_android_uiautomator(code)

注意: childSelector后面的引号要框住整个 子 uiSelector 的表达式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130550.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号