一篇文章带你入门Appium自动化测试

这篇具有很好参考价值的文章主要介绍了一篇文章带你入门Appium自动化测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。



前言

appium是一款移动自动化测试工具,经常被用于实现UI自动化测试,其可支持安卓和IOS两大平台,还支持多种编程,因而得到了广泛的应用。此处便是立足于安卓平台,借助appium工具,使用python语言实现简单的自动化测试。


一、appium支持三种类型的应用

Native App:原生应用(特定移动设备或平台开发的应用程序)
Mobile Web App:移动Web应用(通过移动浏览器访问的应用程序,如IOS的Safari,Android的Chrome)
Hybrid App:混合应用(主要指使用网络技术开发,嵌入到App中运行的应用)


二、设计原理

appium自动化测试,android,python,功能测试,测试工具
appium的核心是一个C/S架构,appium相当于一个web服务器,提供一套接口,它会接收客户端的命令,然后在移动设备上运行命令,最后通过HTTP响应包把结果返回给客户端,每个客户端连接上服务器后都会创建一个session,自动化都会围绕一个session进行。即appium在PC上启动一个Server,监听来自客户端的自动化测试的运行,并将请求发送到对应的的移动设备中运行。


三、Appium的实际应用

三、搭建测试环境

1.安装JDK

(1)JDK包下载网址如下:https://www.oracle.com/java/technologies/downloads/#jdk19-windows,由于原网址下载过慢,也可考虑使用开源软件镜像站下载
(2)下载版本:目前有19、17、11、8等版本的,选合适的就行,这边下载的是1.8.0_282版本
(3)安装:网上教程一堆,安装JDK和配置好环境变量便可
(4)安装完成后使用 win+R 唤出window终端输入 java -version 查看是否安装成功

C:\Users\24637>java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-b08)
Eclipse OpenJ9 VM (build openj9-0.24.0, JRE 1.8.0 Windows 8.1 amd64-64-Bit 20210120_560 (JIT enabled, AOT enabled)
OpenJ9   - 345e1b09e
OMR      - 741e94ea8
JCL      - ab07c6a8fd based on jdk8u282-b08)

2.安装Android SDK

安装Android SDK有两种方法,一种是直接下载安装SDK包,一种是通过Android Studio安装SDK。
1、下载SDK包后解压到你设定的路径,配置好环境变量,SDK包下载网址如下:https://developer.android.google.cn/studio/releases/platform-tools,同样可考虑使用开源软件镜像站下载
2、通过Android Studio安装SDK,选好路径,配置好环境变量,然后启动Android Studio安装对应的sdk包—目前官网推荐的是下载包含有Android SDK的Android Studio。
详细教程上网搜索便可,最终目的是可以正常使用安卓的adb功能,安装完成后使用 win+R 唤出window终端输入 adb --version查看是否安装成功。

C:\Users\24637>adb --version
Android Debug Bridge version 1.0.41
Version 33.0.3-8952118
Installed as E:\android-sdk_r24.4.1-windows\android-sdk-windows\platform-tools\adb.exe

3.安装对应的Python Client

appium Client支持多种编程语言,由于此处使用的是python语言,所以这里选择使用Python-Client,可通过以下两种方法安装对应的测试库。
1、win+R 唤出 window 终端输入:pip install Appium-Python-Client

window 终端输入 pip list 可查看是否安装了对应的包:

C:\Users\24637>pip list
WARNING: Ignoring invalid distribution -ip (e:\python_3.10.2_64_bit\lib\site-packages)
Package                   Version
------------------------- ---------
adbutils                  0.15.2
altgraph                  0.17.3
apkutils2                 1.0.0
Appium-Python-Client      2.2.0
argcomplete               1.12.3

2、pycharm软件安装则是直接搜索安装Appium-Python-Client即可,打开设置菜单 > 项目 > python解释器 > 添加 > 搜索Appium-Python-Client 选中后点击安装即可,安装成功后可以在python解释器里看到对应的包。
appium自动化测试,android,python,功能测试,测试工具

4.安装appium-desktop(服务器)

appium-desktop主要是作为服务器,来监听我们的移动设备,接收Client(客户端)发来的JSON请求,解析后驱动移动设备运行测试用例,我们可以根据自己的平台下载相应的版本。
1、appium-desktop下载网站为: https://github.com/appium/appium-desktop/releases/tag/v1.22.3-4,此处下载的是window版本的appium(Appium-Server-GUI-windows-1.22.3-4.exe)
2、下载完成后直接双击打开安装,安装成功后会在桌面生成一个appium的图标,启动后界面如下图所示,默认显示监听的Host和Port为0.0.0.0:4723,单击启动 “服务器 v1.22.3” 按钮,启动Server,监听本机的4723端口。
appium自动化测试,android,python,功能测试,测试工具

5.Appium Inspector

随着appium-desktop的发展,appium-desktop的服务和查看元素的功能已经分开了,最新版本的appium-desktop目前只作为服务器,而原来的查看元素的功能被剥离了出来,查看元素信息就需要下载Appium Inspector。Appium Inspector下载网站为:https://github.com/appium/appium-inspector/releases,此处下载的版本是:Appium-Inspector-windows-2022.11.1.exe,目前已有最新的版本,也可以直接下载最新的版本便可。下载完后直接安装,启动后界面如下图所示。
appium自动化测试,android,python,功能测试,测试工具

6.安装安卓模拟器

安卓模拟器,顾名思义就是用来模拟安卓设备,从而实现对安卓设备的模拟操作和调试,常用的安卓模拟器有:Android Studio emulator(官方)、genymotion、mumu、雷电、夜神、逍遥等,此处实验使用的模拟器为MuMu模拟器。进入MuMu模拟器官网直接下载便可,下载网站为:https://mumu.163.com/,下载完成后直接打开使用便可,其界面如下。
appium自动化测试,android,python,功能测试,测试工具


四、Appium的基础

**此章节主要是介绍Appium的一些基础,也可以先选择从第五章节看起,先实现Appium的简单例子

1.Desired Capabilities

Desired Capabilities是由客户端生成的一个字典对象,在appium中主要扮演着告诉服务器App(被测App)运行的环境。

import time

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy

# 定义Android运行环境
desired_caps = {
    "deviceName": "Android Emulator",  # 启动的设备
    "automationName": "Appium",  # 使用的自动化引擎,如appium(默认)或Selendroid
    "platformName": "Android",  # 使用的移动平台,如Android或IOs
    "platformVersion": "6.0.1",  # 指定的平台的系统版本,这里为安卓平台,版本7.0
    "appPackage": "com.android.settings",  # 被测试App的Package名
    "appActivity": ".Settings",  # 被测试App的Activity名
    "unicodeKeyboard": True,  # 设置中文键盘
    "resetKeyboard": True,  # 重置自动化时设置的键盘
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 1、使用ID定位(点击搜索)
driver.find_element(AppiumBy.ID, "com.android.settings:id/search").click()

如上代码所示,Desired Capabilities字典里面设置好了待测软件所需要的相关参数,每个字典元素都有其固定的作用,上面只是最为常用的一些参数,想了解更多的配置参数说明,可以参考官方文档:
http://appium.io/docs/en/writing-running-appium/caps/

2.控件定位

(1)使用ID定位
appium自动化测试,android,python,功能测试,测试工具
ID定位是使用控件的resource-id进行定位,通过Appium Inspector工具可以查看resource-id,如上图所示,resource-id的使用用到driver.find_element()函数,安装和导入好对应的库便可使用,且要注意区分AppiumBy模块和By模块,By模块一般用于web的测试,所以此若是用By模块,会导致一些定位方法无法被识别到,所以这里就乖乖使
用AppiumBy就好,方法如下:

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# from selenium.webdriver.common.by import By

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 1、使用ID定位(点击搜索)
driver.find_element(AppiumBy.ID, "com.android.settings:id/search").click()
time.sleep(1)

(2)使用Class Name定位
appium自动化测试,android,python,功能测试,测试工具
通过控件的class属性进行定位,可以通过Appium Inspector工具查看到控件的class属性(如上图所示),若遇到多个元素的class属性都是一个名称,我们可以使用driver.find_elements()函数,先定位一组控件,再进一步筛选,从而找到想要操作的控件,下面是使用class定位一个控件的写法:

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# from selenium.webdriver.common.by import By

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 2、使用Class Name定位(点击退出搜索)
driver.find_element(AppiumBy.CLASS_NAME, "android.widget.ImageButton").click()
time.sleep(1)

(3)使用XPath定位
appium自动化测试,android,python,功能测试,测试工具
XPath是通过查找层级签名来定位控件,可以通过Appium Inspector工具查看到控件的XPath属性(如上图所示),XPath在appium上的用法很强大,就是太长了点,可通过实际应用场景进行使用,使用方法如下:

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# from selenium.webdriver.common.by import By

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 3、使用XPath定位(点击显示)
driver.find_element(AppiumBy.XPATH, "/hierarchy/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.widget.FrameLayout/android.widget.ScrollView/android.widget.LinearLayout/android.widget.LinearLayout[2]/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout").click()
time.sleep(1)

(4)使用Accessibility id定位
appium自动化测试,android,python,功能测试,测试工具
在Android中,Accessibility id定位取控件的content-desc属性,同样可通过Appium Inspector工具查看到对应的属性(如上图所示),使用方法如下:

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# from selenium.webdriver.common.by import By

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 4、使用Accessibility id定位
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "向上导航").click()
time.sleep(1)

(4)使用Android uiautomator定位
Android uiautomator定位,属于appium的扩展定位方法,且只支持Android平台;Android uiautomator可以直接使用UIAutomator2的定位方法来查找控件,由于其使用的是UIAutomator2测试库,所以同样可通过对应的属性来实现对控件的定位,其指同样可以通过Appium Inspector工具查看到对应的属性(如上图所示),此处大概列举几种常见的属性定位方式如下:

import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# from selenium.webdriver.common.by import By

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 5、使用Android uiautomator定位,属于appium的扩展定位方法,且只支持Android平台
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("网易新闻")').click()  #text属性,匹配全部
time.sleep(10)
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textContains("登录")').click()  #text属性,匹配部分
time.sleep(1)
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textStartsWith("我的钱")').click()  #text属性,匹配开头
time.sleep(1)
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().description("返回")').click()   #content-desc属性
time.sleep(1)
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().resourceId("com.netease.newsreader.activity:id/lb")').click()   #id属性
time.sleep(1)
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.TextView")').click()  #class属性
time.sleep(1)
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.EditText")').send_keys("hello world!")  #class属性,(.TextView)元素不能用于输入,(.EditText)元素才能定位后输入

UIAutomator的定位方式有很多,以上简单列举了其对于text属性、content-desc属性、id属性、class属性的使用方法,有兴趣了解更多的,,可以查看官方的文档,其链接如下:https://developer.android.google.cn/training/testing/ui-automator

(4)其它定位

#6、Web APP下,或者Hybrid APP(混合应用)的WebView组件下使用
driver.find_element(AppiumBy.NAME, "").click()
driver.find_element(AppiumBy.TAG_NAME, "").click()
driver.find_element(AppiumBy.LINK_TEXT, "").click()
driver.find_element(AppiumBy.PARTIAL_LINK_TEXT, "").click()
driver.find_element(AppiumBy.CSS_SELECTOR, "").click()
time.sleep(1)
#7、前面三个是IOS的定位,后4个不常用,这里就不做介绍了
driver.find_element(AppiumBy.IOS_UIAUTOMATION, "").click()
driver.find_element(AppiumBy.IOS_PREDICATE, "").click()
driver.find_element(AppiumBy.IOS_CLASS_CHAIN, "").click()
driver.find_element(AppiumBy.ANDROID_VIEWTAG, "").click()
driver.find_element(AppiumBy.ANDROID_DATA_MATCHER, "").click()
driver.find_element(AppiumBy.IMAGE, "").click()
driver.find_element(AppiumBy.CUSTOM, "").click()

实际的定位方法还有很多,前面就简单列举几种最常见的方法,其他方法可在实践中继续学习拓展

3.appium的常用API

(1)应用操作

1、driver.install_app(“应用包名路径”) #安装app
2、driver.remove_app(“应用包名”) #卸载app
3、driver.terminate_app(“应用包名”) #关闭app
4、driver.activate_app(“应用包名”) #打开app
5、result = driver.is_app_installed(“应用包名”) #判断app是否安装
print(result)
6、driver.background_app(10) #退至后台
Appium可通过以上对应的函数实现对app应用的各种操作,如安装、卸载、关闭、打开等,例子如下:

import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

driver.terminate_app("com.android.settings")    #关闭设置应用
time.sleep(1)
if driver.is_app_installed("com.adsk.sketchbook"):  #判断应用是否已安装
    driver.remove_app("com.adsk.sketchbook")      #卸载应用
    print("卸载书写软件成功!")
else:
    driver.install_app("C:/Users/24637/Desktop/自动化测试常用软件/com.adsk.sketchbook_5.2.5_liqucn.com.apk")    #安装应用
    print("软件不存在,正在安装。。。")
driver.activate_app("com.netease.newsreader.activity")
driver.background_app(5)    #退至后台

(2)上下文操作
1、contexts = driver.contexts #获取当前所有可用上下文
print(contexts)
2、current_context = driver.current_context #获取当前上下文
print(current_context)
3、driver.switch_to.context(‘NATIVE_APP’) #切换上下文

import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

#上下文操作
contexts = driver.contexts  #获取当前所有可用上下文
print(contexts)
current_context = driver.current_context  #获取当前上下文
print(current_context)
# driver.switch_to.context('NATIVE_APP')   #切换上下文

上下文就是一种属性的有序序列,为驻留在环境内的对象定义环境,appium里面的上下文主要针对混合应用,它们与App原生控件和内嵌的Web页面上的元素的定位方式不同,所以需要确认当前操作的元素或者控件的上下文,以便于使用不同的定位策略
(3)键盘输入
1、driver.keyevent(键值码)

import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

driver.activate_app("com.netease.newsreader.activity")  #打开网易新闻应用
time.sleep(5)

driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.TextView")').click()  #点击搜索
time.sleep(1)	
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.EditText")').send_keys("jack!") 	 #输入jack
time.sleep(1)
#键值输入186
driver.keyevent(8)
driver.keyevent(15)
driver.keyevent(13)
#键值输入hello
driver.keyevent(36)
driver.keyevent(33)
driver.keyevent(40)
driver.keyevent(40)
driver.keyevent(43)

将光标定位到了某输入框后,自动进入键盘输入模式,执行keyevent()方法,输入对应的字符编号,这便是键值函数的用法。以上只是简单列举了一些键值的用法,更多键值信息在以下网站找到参考:https://developer.android.google.cn/reference/android/view/KeyEvent
(4)触摸操作 TouchAction
1、触摸点击操作
触摸点击操作函数TouchAction(driver).tap(),主要有三个参数,坐标点(x=33, y=86)、控件元素(element = el)和点击次数(count = 2),通过对这三个参数的操作,可实现使用坐标或者控件进行触摸定位,实现单击和双击的触摸点击功能,其具体使用例子如下所示:

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.common.touch_action import TouchAction

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

driver.activate_app("com.netease.newsreader.activity")  #打开网易新闻应用
time.sleep(15)

#通过控件实现触摸
el = driver.find_element(AppiumBy.ID, "com.netease.newsreader.activity:id/c52")
actions = TouchAction(driver).tap(element=el)
actions.perform()

#通过坐标点实现触摸
actions = TouchAction(driver)
actions.tap(x=333, y=609)
actions.perform()

#双击
actions = TouchAction(driver)
actions.tap(x=333, y=609,count=2) #count为点击次数
actions.perform()

2、触摸长按

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.common.touch_action import TouchAction

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

driver.terminate_app("com.android.settings")
#长按控件
el = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'text("网易新闻")')
TouchAction(driver).long_press(el, duration=2000).perform()
TouchAction(driver).long_press(x=521, y=349, duration=2000).perform()

3、移动
将光标移动到新的元素或坐标点,同样可以通过控件和坐标进行定位,而后进行移动操作,其函数如下:

#移动
el = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'text("CIBN酷喵")') #通过控件定位
TouchAction(driver).move_to(el).perform()
TouchAction(driver).move_to(x=523, y=507).perform() #通过坐标定位

4、暂停
暂停脚本的执行,wait(self,ms=0),单位为毫秒

TouchAction(driver).wait(5000).perform()

5、多点触控执行
appium不仅可以执行一个动作,还可以同时执行多个动作,形成动作链,模拟多个手指触摸的动作,appium需要通过构建一个MultiAction对象来实现执行多个动作的。通过导入MultiAction库进行编写,如下所示:

from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from appium.webdriver.common.multi_action import MultiAction

desired_caps = {
	...
	...
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

driver.terminate_app("com.android.settings")
time.sleep(3)

#同时执行多个动作 MultiAction
a1 = TouchAction()
a1.press(x=243,y=184)
a1.move_to(x=930, y=184)
a1.release()

a2 = TouchAction()
a2.long_press(x=243,y=342)
a2.move_to(x=930, y=342)
a2.release()

ma = MultiAction(driver)
ma.add(a1, a2)
ma.perform()

(5)特有操作
1、获取当前App的包名(package),仅支持Android

package = driver.current_package
print(package)

2、获取当前App的activity,仅支持Android

activity = driver.current_activity
print(activity)

3、收起键盘(有些客户端可能无效)

activity = driver.current_activity
print(activity)

4、息屏(有些客户端可能无效)

driver.lock(seconds=1)

5、获取屏幕宽高

windows = driver.get_window_size()
print(windows["width"])
print(windows["height"])

6、拉取文件
拉取文件到设备中,这里要注意拉取到的数据格式为base64编码的,所以这里要进行编解码处理,并导入base64库。

import base64

file_base64 = driver.pull_file('/sdcard/1.txt').encode()	#encode()函数,将字符串Str类型数据转换成bytes数据类型
file_base64 = base64.decodebytes(file_base64)	#这里是把bytes的数据进行base64解码,解码成功后,返回的数据类型为bytes
print(file_base64.decode())	#把bytes数据类型转换成Str数据类型,并打印出来

7、推送文件
把文件推送到设备中

import base64

data = "some data for the file"
data = base64.b64encode(data.encode('utf8'))	#编码成base64数据,并转换成bytes格式的数据
path = "/sdcard/1.txt"
driver.push_file(path, data.decode())	#把数据推送到设备里面

以上便是appium的一些常用API的用法,要想进一步了解更多的API的接口信息,则也可以直接进入以下网址查询,基本所有相关的API使用方法都能在里面找到,Appium的API接口文档链接如下:https://appium.io/docs/en/about-appium/api/
此外,想了解更多的appium内容,也可以到官网查看它的相关信息,appium官网链接如下:http://appium.io/docs/en/about-appium/intro/

4.Appium Inspector

对于Appium Inspector的使用,这里主要讲解它两个基本的功能,获取元素的控件信息和录制脚本的功能,其具体用法如下。
(1)获取元素的功能
上面讲解元素的定位方式的时候,获取App的相关控件参数也是通过Appium Inspector来实现的,这里边简单的展开讲解下其使用的方法。
1、启动MuMu模拟器,win + r 输入cmd进入window终端,输入:“adb connect 127.0.0.1:7555” 连接上安卓模拟器

C:\Users\24637>adb connect 127.0.0.1:7555
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to 127.0.0.1:7555

2、启动Appium Server GUI
直接点击打开后,点击启动服务器便可
appium自动化测试,android,python,功能测试,测试工具
3、启动Appium Inspector
按照以上图片所示,设置好IP和端口,并根据终端App运行的环境,设置好Desired Capabilities的参数值,点击运行。
appium自动化测试,android,python,功能测试,测试工具
4、获取控件元素信息
启动Appium Inspector成功后,会进入到以上界面,选中查看元素模式,把光标移动到对应的App元素上,右边便可出现对于的元素控件信息
appium自动化测试,android,python,功能测试,测试工具
(2)录制脚本的功能
录制脚本,也可以分为根据坐标操作元素和根据控件操作元素两大内容
appium自动化测试,android,python,功能测试,测试工具
1、通过坐标操作元素-点击
点击中间像眼睛的按钮,打开录制功能,把模式切换为点击坐标点的模式,点击客户端的坐标元素,便会同步在右边的录制显示框显示对应的代码,如上图所示,连续多次点击执行,便会生成对应的自动化测试脚本,把其复制粘贴到python里面运行便可。

#此处为点击后,生成的代码
actions = ActionChains(driver)
actions.w3c_actions = ActionBuilder(driver, mouse=PointerInput(interaction.POINTER_TOUCH, "touch"))
actions.w3c_actions.pointer_action.move_to_location([object Object], undefined)
actions.w3c_actions.pointer_action.pointer_down()
actions.w3c_actions.pointer_action.pause(0.1)
actions.w3c_actions.pointer_action.release()
actions.perform()

这里注意两点内容,第一点为:在复制代码时,需要选择显示全部的代码,并且复制全部的代码,而不是只移植一个函数;第二点为:如上显示的代码所示,获取到的函数的坐标是([object Object], undefined),这里移植到python里面运行的话,是会报错的,这里需要手动输入点击的坐标值,即要改为以下代码::

actions.w3c_actions.pointer_action.move_to_location(179,282)

2、通过坐标操作元素-滑动
appium自动化测试,android,python,功能测试,测试工具
打开录制功能,把模式切换为滑动坐标的模式,先选中一个点,再选中一个点,实现滑动操作,同样生成对应的滑动代码如下

#此处为滑动后,生成的代码
actions = ActionChains(driver)
actions.w3c_actions = ActionBuilder(driver, mouse=PointerInput(interaction.POINTER_TOUCH, "touch"))
actions.w3c_actions.pointer_action.move_to_location([object Object], undefined)
actions.w3c_actions.pointer_action.pointer_down()
actions.w3c_actions.pointer_action.move_to_location(undefined, undefined)
actions.w3c_actions.pointer_action.release()
actions.perform()

同上,复制全部的代码到python,更改对应函数里的坐标值,便可实现滑动操作了。

actions.w3c_actions.pointer_action.move_to_location(714,822)

actions.w3c_actions.pointer_action.move_to_location(714,307)

3、通过控件操作元素-点击
appium自动化测试,android,python,功能测试,测试工具
打开录制功能,把模式切换为选择元素的模式,选中一个元素,使用右边的选定元素里的小工具实现点击功能。

#通过控件点击搜索设置
el2 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="搜索设置")
el2.click()

通过控件操作有个好处就是不需要手动更改代码的坐标,可直接复制全部的代码到python,便可实现代码的运行。

4、通过控件操作元素-发送密钥
appium自动化测试,android,python,功能测试,测试工具
打开录制功能,把模式切换为选择元素的模式,点击选中,并进入到输入框,使用右边的选定元素里的小工具实现输入密钥‘hello’的功能。

#点击搜索框,并切换至输入模式,输入hello
el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="搜索设置")
el1.click()
el2 = driver.find_element(by=AppiumBy.ID, value="android:id/search_src_text")
el2.click()
time.sleep(1)	#增加的延时
el2.send_keys("hello")

使用密钥时,要确保已经定位到了输入框。复制全部的代码到python,可能会出现执行到输入密钥时报错的情况,这大概率是由于指令执行过快,App的输入框还没完全反应过来,便执行输入导致,此时可手动增加一个延时便可实现代码的运行。
除了以上介绍的基本用法外,还有应用的其他详细功能,这里就不多介绍了,工具类就多操作,多尝试,这里只要掌握了自动脚本录制和移植到python运行便可,其它细节的功能,可边用边发掘。

五、Appium的实际应用

经过前面的介绍,大家基本可以入门appium了,下面就用前面所学的内容,实现以下的UI自动化内容:运行脚本,进入设置App > 点击
(1)启动MuMu安卓模拟器
由于下面编辑的自动化脚本用到网易新闻,所以这里也可以先下载好网易新闻的apk,并安装好。
appium自动化测试,android,python,功能测试,测试工具
(2)启动Appium Server GUI
appium自动化测试,android,python,功能测试,测试工具
(3)win + r 输入cmd进入window终端,输入:“adb connect 127.0.0.1:7555”连接上安卓模拟器
appium自动化测试,android,python,功能测试,测试工具
(4)点击打开Appium Inspector,获取控件元素
appium自动化测试,android,python,功能测试,测试工具
(5)打开PyCharm输入以下代码,运行前面(1)-(4)的内容,操作方法前面已经介绍了,这里便直接进行代码编辑的实操介绍,环境搭建好后,便可开始进行代码的编写,这里结合以上的内容,运用上面所学的基本知识,立足于原生设置菜单和网易新闻apk,编写一个简单的完整例子如下:

import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy

# 定义Android运行环境
desired_caps = {
    "deviceName": "Android Emulator",  # 启动的设备
    "automationName": "Appium",  # 使用的自动化引擎,如appium(默认)或Selendroid
    "platformName": "Android",  # 使用的移动平台,如Android或IOs
    "platformVersion": "6.0.1",  # 指定的平台的系统版本,这里为安卓平台,版本6.0.1
    "appPackage": "com.android.settings",  # 被测试App的Package名
    "appActivity": ".Settings",  # 被测试App的Activity名
    "unicodeKeyboard": True,  # 设置中文键盘
    "resetKeyboard": True,  # 重置自动化时设置的键盘
}

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 1、使用ID定位(点击搜索)
driver.find_element(AppiumBy.ID, "com.android.settings:id/search").click()
time.sleep(1)
# 2、使用Class Name定位(点击退出搜索)
driver.find_element(AppiumBy.CLASS_NAME, "android.widget.ImageButton").click()
time.sleep(1)
# 3、使用XPath定位(点击显示)
driver.find_element(AppiumBy.XPATH, "/hierarchy/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.widget.FrameLayout/android.widget.ScrollView/android.widget.LinearLayout/android.widget.LinearLayout[2]/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout").click()
time.sleep(1)
# 4、使用Accessibility id定位(点击返回)
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "向上导航").click()
time.sleep(1)
# 5、使用ID定位(点击搜索)
driver.find_element(AppiumBy.ID, "com.android.settings:id/search").click()
time.sleep(1)
# 6、使用CLSS_NAME定位,输入hello
driver.find_element(AppiumBy.CLASS_NAME, "android.widget.EditText").send_keys("hello")
time.sleep(3)
# 7、退出设置菜单
driver.terminate_app("com.android.settings")
# 使用Android uiautomator定位,属于appium的扩展定位方法,且只支持Android平台
# 8、text属性,匹配全部,识别到网易新闻,并点击
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("网易新闻")').click()
time.sleep(15)
# 9、text属性,匹配部分,识别到部分内容,并点击
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textContains("登录")').click()
time.sleep(1)
# 10、text属性,匹配开头,识别开头文字,并点击
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textStartsWith("我的钱")').click()
time.sleep(1)
# 11、content-desc属性,根据content-desc属性识别,点击返回
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().description("返回")').click()
time.sleep(1)
# 12、id属性,根据id属性识别,点击返回首页
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().resourceId("com.netease.newsreader.activity:id/lb")').click()
time.sleep(1)
# 13、class属性,根据class属性识别,点击输入框
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.TextView")').click()
time.sleep(1)
# 14、class属性,(.TextView)元素不能用于输入,(.EditText)元素才能定位后输入,根据class属性识别,进入输入框输入模式,输入hello world!
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.EditText")').send_keys("hello world!")
time.sleep(5)
# 15、退出网易新闻
driver.terminate_app("com.netease.newsreader.activity")

脚本运行效果视频如下所示:

脚本运行效果

六、总结

至此,关于使用appium的简单介绍就到这里了,师傅领进门,修行看个人,结合实际,把技术灵活运用才是王道。冲鸭,社畜们,无聊的生活可太需要知识的调和了。文章来源地址https://www.toymoban.com/news/detail-751512.html

到了这里,关于一篇文章带你入门Appium自动化测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 自动化测试框架环境怎么搭建?这篇文章给你讲的明明白白

    目录 Python 自动化测试框架环境搭建 第一步:安装 Python 第二步:安装 PyCharm 第三步:安装 Selenium WebDriver 第四步:安装浏览器驱动 第五步:创建测试用例 第六步:集成持续集成平台 总结 Python 是一种流行的编程语言,可以用于多种应用场景,包括自动化测试。本文将介绍如

    2023年04月12日
    浏览(37)
  • Apple主推的智能家居是什么、怎么用?一篇文章带你从零完全入门 HomeKit

    如果你对智能家居有所了解,那应该或多或少听人聊起过 HomeKit。由 Apple 开发并主推的的 HomeKit 既因为产品选择少、价格高而难以成为主流,又因其独特的优秀体验和「出身名门」而成为智能家居领域的焦点。HomeKit 究竟是什么?能做什么?怎么做到的? 想要准确描述 HomeK

    2024年02月13日
    浏览(43)
  • 一篇文章带你搞懂spring6的概念、spring入门与容器IoC详解(尚硅谷笔记)

    Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring 框架

    2023年04月16日
    浏览(29)
  • RabbitMQ篇——一篇文章带你入门RabbitMQ,了解RabbitMQ的角色分类权限、AMQP协议以及设计第一个RabbitMQ程序!

    RabbitMQ是一个开源的消息代理和消息队列系统,采用AMQP(Advanced Message Queuing Protocol)协议。它被设计用于在分布式系统中进行高效,可靠和可扩展的消息传递。 RabbitMQ基本概念: Producer(生产者):生产者负责发布消息到消息队列中。 Consumer(消费者):消费者从消息队列中

    2024年01月16日
    浏览(44)
  • b树(一篇文章带你 理解 )

    目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据库 六、总结 在计算

    2024年03月17日
    浏览(40)
  • 一篇文章,带你彻底掌握接口测试!

    一、什么是接口测试? 所谓接口,是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试,则是通过接口的不同情况下的输入,去对比输出,看看是否满足接口规范所规定的功能、安全以及性能方面的要求。 二、为什么要

    2024年02月10日
    浏览(38)
  • 一篇文章带你了解SpringBoot目录结构

    前言 SpringBoot是整合Spring技术栈的一站式框架,是简化Spring技术栈的快速开发脚手架,是一个能够快速构建生产级别的Spring应用的工具。SpringBoot是目前流行的微服务框架,倡导“约定优于配置”,简化Spring项目搭建及开发过程。springboot提供了很多核心的功能,比如自动化配置

    2024年03月25日
    浏览(54)
  • 一篇文章带你搞懂前端Cookie

    浏览器Cookie相信各位点进这篇文章的小伙伴应该不陌生了,它是前端领域中一个非常重要的内容,当然也是面试的一个考点,不知道各位小伙伴是否真正掌握了Cookie呢?当然没有掌握也是没有关系的,可以跟着小编的脚步一起来学习一下前端Cookie,没有熟练掌握的小伙伴看完这

    2024年02月04日
    浏览(34)
  • 一篇文章带你走进Java(保姆级)

    手打不易,希望对各位还在徘徊学什么语言的有帮助!!java不会让你失望!! Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。 Java还是有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持

    2024年02月15日
    浏览(42)
  • 一篇文章带你实现栈的接口

    栈(Stacks)是限定在一端插入和删除的线性表。允许插入和删除的一端称为栈顶(Top),另一端称为栈底(Bottom)。栈中的数据元素遵守后进先出(Last In First Out)的原则。因此,栈又称为后进先出(先进后出)线性表。 压栈:栈的插入操作叫做进栈、压栈、入栈,入数据在

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包