Appium的使用

article/2025/9/23 8:52:42

一、环境配置:
1、安装Node.js
2、配置JDK环境
3、配置Android SDK环境
4、安装Appium桌面版本
5、配置Python环境,安装selenium、Appium-Python-Client库
6、安装模拟器(MuMu模拟器)

环境配置参考:

这里是引用

二、使用Appium的查看元素信息

1、打开安装好的MuMu模拟器。

2、打开Appium的桌面版本,点击’启动审查器会话’。(也可以使用Android SDK自带的UiAutomatorViewer查看元素信息)
在这里插入图片描述
3、输入启动的初始化参数,必需输入platformName这个参数:
在这里插入图片描述
可选参数:
在这里插入图片描述
启动成功就可以在该界面看到app中元素的信息:
在这里插入图片描述

ps:或者使用Android sdk自带的UIAutomatorViewer查看元素信息:
步骤:
1、启动待测试的app。
2、window下打开Android sdk的tools目录,双击 uiautomatorviewer.bat;mac下打开tools/bin目录下的uiautomatorviewer。
3、在模拟器上打开元素所在的页面,然后点击UI Automator Viewer的左边起第二个按钮即可获取元素信息。
4、如果打开uiautomatorviewer闪退就可能是jdk1.9造成的,换成jdk1.8,点击第二个按钮报错的解决方法是重启adb服务:adb kill-server 、 adb start-server
在这里插入图片描述
在这里插入图片描述

4、在步骤3中找到元素后就可以在pycharm里面编写代码进行自动化逻辑操作:

'''前置代码段'''from appium import webdriver#初始化信息
capabilities = {} 
# Android平台测试
capabilities['platformName'] = 'Android'
# 测试手机版本为6.0
capabilities['platformVersion'] = '6.0.1'
capabilities['deviceName'] = 'Android Emulator'
# 模拟器上要测试的那个app的包名   可以用adb命令查看
capabilities['appPackage'] = 'com.codemao.lunar'
# 模拟器上要测试的app的中主入口activity(界面名)   可以用adb命令查看
capabilities['appActivity'] = '.MainActivityV2'# 连接测试机所在服务器服务器
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', capabilities)

三、常见的元素定位的几种方式

1、id定位
driver.find_element_by_id(id_value) # 定位一个元素,没找到的话会报错NoSuchElementException
driver.find_elements_by_id(id_value) # 定位一组元素,返回值是一个列表, 传入错误参数没找到元素不会报错,只会返回空列表

2、class定位
driver.find_element_by_class_name(class_value)
driver.find_elements_by_class_name(class_value)

3、xpath定位
driver.find_element_by_xpath(xpath_value)
driver.find_elements_by_xpath(xpath_value)

4、AccessibilityId也称为content-desc
driver.find_element_by_accessibility_id(‘题库’)
在这里插入图片描述
5、通过Android UIAutomator定位
driver.find_element_by_android_uiautomator(‘new UiSelector().text(“请输入手机号”)’)
具体使用参考下文

参考文章引用
UiAutomatorViewer&元素定位方法

四、元素等待
概念:找元素的时候,通过一个时间的设置,进行等待元素,等待元素出来之后,再来定位,防止报错。
应用场景:如果某个元素没有及时出来,那么我们就应该使用元素等待。
分类:隐式等待、显示等待、强制等待

隐式等待和显式等待的选择:
作用域:显式等待为单元素有效,隐式为全局元素。
方法:显式等待方法封装在WebDriverWait类中,而隐式等待则直接通过driver实例化对象调用。
从使用的角度上:隐式等待更简单,显式等待相对复杂。
从灵活性的角度上:显示等待更加灵活,因为可以针对每一个元素进行单独的设置;隐式等待是针对全局的定位元素。

1、隐私等待
概念:等待元素加载指定的时长,超出时长抛出NoSuchElementException。
应用场景:针对所有定位的元素的超时时间设置为同一个值的时候。
步骤:获取到driver对象,直接调用implicitly_wait(time_out)即可,以秒为单位。

from selenium.webdriver.support.wait import WebDriverWait
#在10秒内,找到元素就继续操作,找不到就报错
#只要设置一次,所有元素都是都会生效
driver.implicitly_wait(10) 

2、显示等待
概念:等待元素加载指定的时长,超出时长抛出TimeoutException。
应用场景:针对所有定位元素的超时时间设置为不同的值的时候。
步骤:
a.导包
b.创建WebDriverWait对象
c.调用WebDriverWait对象的until方法
示例:

from selenium.webdriver.support.wait import WebDriverWait#在5秒内,每1s在《设置》程序中的“返回”按钮,如果找到就点击,找不到则观察对应错误信息。
#创建WebDriverWait对象
wait = WebDriverWait(driver,5,poll_frequency=1)  # poll_frequency默认是0.5,设置为1就是每秒去调用一次这个方法,
#获取元素并设置超时时间和频率
search_btn = wait.until(lambda x: x.find_element_by_xpath("//*[contains(@content-desc,'收起')]"))
#点击搜索按钮
search_btn.click()

3、强制等待

import timetime.sleep(5)  #强制等待5秒再执行下面的代码

五、driver常用的api

1、将app置于后台:
driver.background_app(5) #把app置于后台5秒再返回app

2、关闭应用,不会关闭driver:
driver.close_app()
关闭应用及driver:
driver.quit( )

3、安装和卸载应用:
driver.install_app(app_path)
driver.remove_app(app_id) #包名

六、元素常用的api

1、点击元素:
element.click()

2、输入和清空输入框内容:
element.send_keys(vlaue)
element.clear()
注意:默认输入中文是有问题的,需要在连接手机的参数加上两行代码(我上面的前置代码初始化参数变量名是capabilities):
capabilities[‘unicodeKeyboard’] = True
capabilities[‘resetKeyboard’] = True

3、获取元素的内容:
场景:获取按钮、文本框、输入框等控件的文本内容时使用
属性名:element.text

#获取element控件的文本内容
#返回值: 控件的文本内容
titles = driver.find_elements_by_id('com.android.settings:id/title') #获取手机系统设置的所有元素
for i in titles:print(i.text) #循环输出系统设置的元素名称:WiFi、电量、应用管理等...

4、获取元素的大小和位置
#获取的值是int类型的
element.location #返回值是字典类型: {“x”:xxx,“y”:xxx }
element.size #返回值是字典类型:{“width”:xxx,“height”:xxx}

5、获取元素的属性值
element.get_attribute(“属性名”)在这里插入图片描述
注意:上图所示,有些元素的text和content-desc其中一个是空的其中一个不为空,这时候用element.get_attribute(“name”)就会返回content-desc或者text的值。

6、滑动和拖拽事件
swipe滑动事件
概念:从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动,有惯性

'''swipe(起始的x坐标值,起始的y坐标值,终点的x坐标值,终点的y坐标值,持续时间ms)'''
#当持续时间很长的时候,就没有惯性
driver.swipe(100,2000,100,1000,300) #300毫秒内实现滑动

在这里插入图片描述
scroll滑动事件
概念:从一个元素滑动到另外一个元素,直到页面自动停止。(有惯性,惯性很大)
driver.scroll(起始元素,结束元素,duration=600) #默认可以不传duration,默认是600ms,duration的值越大,惯性越小。

drag_and_drop拖拽事件
概念:从一个元素滑动到另外一个元素,第二个元素替代第一个元素的位置。(无惯性)
driver.scroll(起始元素,结束元素)

#手机的系统设置页面,滑动存储到更多的位置
save_button =driver.find_element_by_xpath("//*[@text='存储]")
more_button=driver.find_element_by_xpath("//*[etext='更多]")
driver.scroll(save_button,more_button)
driver.drag_and_drop(save_button,more_button)

在这里插入图片描述

七、高级手势TouchAction 的操作
应用场景:TouchAction 可以实现一些针对手势的操作,比如滑动、长按、拖动等。我们可以将这些基本手势组合成一个相对复杂的手势。比如,我们解锁手机或者一些应用软件都有手势解锁的这种方式。
使用步骤:
a.创建TouchAction对象
b.通过对象调用想执行的手势
c.通过perform( ) 来触发执行

1、手指轻敲
tap(元素,count=1)
tap(x=100,y=100,count=1) #count可以指定点击次数,也可以不写这个参数

 TouchAction(driver).tap(search_btn).perform()TouchAction(driver).tap(x=300, y=400)

2、按下和抬起
应用场景:模拟手指一直按下,模拟手机抬起。可以用来组合模拟轻敲或长按动作。
press(元素) #参数可以传元素对象或者是坐标。
press(x=650,y=650)
release()

#TouchAction(driver).press(search_btn).perform()
TouchAction(driver).press(x=650,y=650).perform()
time.sleep(2)
TouchAction(driver).press(x=650,y=650).release().pecform() #模拟松手

3、等待操作
应用场景:模拟手指等待,比如按下后等待5秒之后再抬起
TouchAction(driver).wait(second_ms).pecform()

#时间是毫秒
TouchAction(driver).press(x=650,y=650).wait(1000).release().perform()

4、长按操作
应用场景:模拟手指对元素或者坐标的长按操作。比如长按某个按钮弹出菜单。
TouchAction(driver).long_press(元素,duration=1000) #参数可以传元素,持续时间单位是毫秒
TouchAction(driver).long_press(x=100,y=200,duration=1000) #参数传坐标

TouchAction(driver).long_press(search_btn,duration=2000).perform()
TouchAction(driver).long_press(x=650,y=650,duration=2000).perform()

5、移动操作
应用场景:模拟手指的移动操作,比如手势解锁需要先按下,再移动手指,再松手。
TouchAction(driver).move_to(元素) # 参数传元素
TouchAction(driver).move_to(x=100,y=200) #参数传坐标

TouchAction(driver).press(x=650,y=650).move_to(x=100,y=200).release().perform()

![在这里插入图片描述](https://img-blog.csdnimg.cn/d981cd45022a479e97a90bb97153b58e.png在这里插入图片描述
八、手机操作API
学习目的:获取手机分辨率、获取手机截图、获取和设置网络状态、能够发送按键到设备、能打开和关闭手机通知栏

1、获取手机的分辨率(计算一些点击或滑动的坐标)
driver.get_window_size( )
返回值是字典{“height”:800,“width”:480}

2、获取手机截图
使用场景:有些自动化的操作可能没有反应,但是并不报错,此时我们可以将操作过后的关键情况,截图保存。后期也可以根据图片发现问题。
driver.get_screenshot_as_file(filename) # 写文件的路径

#直接写文件名的话默认保存在项目目录下
driver.get_screenshot_as_file(os.getcwd()+os.sep+'./screen.png')

3、获取手机网络和设置手机网络
应用场景:视频应用在使用流量播放的时候,大部分都会提示用户是否继续播放。作为测试人员,我们可能需要用自动化的形式来判断是否有对应的提示。即,用流量的时候应该有提示,不用流量的时候应该没有提示。
driver.network_connection #获取当前的网络类型
下图的返回值就是数据、Wi-Fi和飞行模式。
设置网络driver.set_network_connection(value) #value是下图的0,1,2,4,6在这里插入图片描述
4、发送键到设备
应用场景:模拟按手机按键,如“返回键”等。
#keycode:按键对应的编码,可以在百度搜索关键字“Android keycode”
#metastate:关于发送的关键代码的元信息,一般为默认值不传。
driver.press_keycodes(keycode,metastate=None)

driver.press_keycodes(24) #按音量加键

5、操作手机通知栏
应用场景:测试即时通信类软件的时候,如果A给B发送一条消息,B的通知栏肯定会显示对应的消息。我们想通过通知栏来判断B是否接收到消息,一定要先操作手机的通知栏。
#打开手机通知栏
driver.open_notifications( )
#关闭手机通知栏:官方没提供api,通过手势操作实现效果,手机上滑动或者模拟按返回键之类的吧。


http://chatgpt.dhexx.cn/article/HhSNPkEn.shtml

相关文章

Appium 介绍以及工作原理

目录 1、什么是Appium:2、Appium各类组件:3、Appium理念:4、三张图了解 Appium工作原理: 1、什么是Appium: appium是一个移动端的自动化测试框架,可用于测试原生应用、移动网页应用、混合型应用&#xff0…

了解appium自动化的工作原理(uiautomator)

一、Appium加载的过程图解 Appium的原理 WebDriver script:我们的测试脚本(java or python) Appium: 会首先开启一个监听4723端口的server,接收测试脚本发送过来的对应请求,再将对应的请求发送给中间件Bo…

appium自动化的工作原理

appium自动化的工作原理 1. Appium组件 Appium Server Appium是一个C/S结构,包括Server和Client。Appium Server是Appium的服务端,作为一个Web接口服务,使用Node.js实现。 Appium Desktop Appium Server的图像界面,可设置启…

【Appium系列】- 框架原理

目录 简介 Appium支持哪些平台呢? Appium架构 Session Desired Capabilities 简介 Appium是一个跨平台的开源的自动化测试工具,可以用于测试不同类型的移动端应用程序(Appium基础之App类型),这是一个非常优秀好用…

Appium学习日记(一)——Appium工作原理及其主要组件

Appium工作原理及其主要组件 Appium的工作原理(how Appium works) Appium的核心是一个服务器,它侦听符合API规范WebDriver的传入HTTP请求。对于那些过去使用Selenium为基于浏览器的应用程序进行测试自动化的人来说,这听起来可能已经很熟悉了。   WebD…

Appium详解

一、Appium安装 1、安装JDK(1.8.0)并配置环境 1、JDK文件下载安装下载JDK文件,点击运行安装2、配置环境(1)新建一个名为“JAVA_HOME”的环境变量,变量值为JDK的安装路径(2)选择Path…

appium工作原理详讲

appium简介 appium是一个移动端自动化框架,它采用C/S的设计模式,支持多类开发语言(java python js c#…)、支持多平台(ios android),支持跨平台使用(windows linux)。它适用于原生或混合移动应用; appium…

Appium自动化测试基础 — APPium基本原理

1、APPium自动化测试架构 APPium是一个C/S架构的自动化测试框架,APPium的核心其实是一个暴露了一系列REST API的server。(也就是Appium的核心是一个提供了一组REST API的Web服务器。) 这个server的功能其实很简单:监听一个端口&a…

Appium的工作原理终于搞清楚了

目录 1. Appium简介 1.1 Appium的理念 1.2 Appium 的设计 1.3 Appium 的概念 2. Appium原理架构 3. appium的工作流程 4. Appium-Uiautomator2-Server 4.1 Appium-Uiautomator2-Server简介 4.2 appium-uiautomator2-server运行原理 4.3 bootstrap vs appium-uiautoma…

APP自动化测试系列之Appium介绍及运行原理

在面试APP自动化时,有的面试官可能会问Appium的运行原理,以下介绍Appium运行原理。 一、Appium介绍 1.Appium概念 Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。它使用WebDriver协议驱动IOS&#xf…

Appium工作原理

一、Appium工作原理 1、Appium启动的时候,会创建一个http\\127.0.0.1:4723\wd\hub服务端(中转站) 2、4723端口接收client(也就是测试脚本)发来的请求,解析对应的请求 3、appium server把对应的请求发给bootstrap.jar,它…

蓝桥杯C/C++ 基础练习 十六进制转八进制 C语言

题目: 分析: 思路:先将十六进制转为二进制,然后将二进制转为八进制 遇到的问题如下: 1、输入格式和输出格式,决定了需要用数组存储十六进制数、二进制数以及八进制数。由于有多个字符串(多位…

蓝桥杯——十六进制转八进制(Java解法)

这道题其实挺难的,之前做过一次,用的十六进制转化为十进制,然后用十进制再转化为八进制,代码很简单,用的jdk上自带的进制转换进行换算。 import java.util.Scanner; /** * author 作者 E-mail: WYJ 1627407425qq.com…

蓝桥杯-十六进制转八进制(Java)

蓝桥杯-十六进制转八进制(Java) 最近在练习算法题,打算应付一下下学期的蓝桥杯,写写博客记录一下我的学习过程,对算法感兴趣的朋友可以给小编点点关注(重要的事情加上强调标志,o( ̄︶ ̄)o),这个假…

蓝桥杯C语言 十六进制转八进制

十六进制转八进制 思路分析: 39十六进制先转换为4位二进制,3为0011,9为1001,所以39的二进制为00111001,又把二进制转化为3位八进制,从右边开始数,001为1,111为7,所以39的八进制为71。…

十六进制转换八进制

问题描述 给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n &#xff08;1<n<10&#xff09;。   接下来n行&#xff0c;每行一个由09、大写字母AF组成的字符串&#xff0c;表示要转换的十六进制正整数&#xff0…

蓝桥杯练习:C语言十六进制转八进制

这题对我来说是有点难度的,最后做出来,但是提交显示 运行错误,看不出哪里出错了. 我的思路: 将十六进制转化为二进制,二进制最后转化为八进制. 首先将十六进制存入数组,然后将数组中每一位转化为对应的十进制数,之后将再将每一位十进制数转化为二进制数,将这些二进制数以每三…

C语言十六进制转八进制

思路&#xff1a;将十六进制先转为十进制再转为八进制 十六进制转十进制:与二进制转十进制类似。对十六进制每个数从左往右依次乘16的0,1,2,......并相加得到相应的十进制。 比如&#xff1a;对123ABC&#xff0c;1216&#xff08;0&#xff09;1116&#xff08;1&#xff09…

XPC U盘启动盘的制作

XPC U盘启动盘的制作 对于XPC目标机的启动&#xff0c;我们可以通过网络、硬盘或者 U盘启动目标机。这里介绍一下通过U盘的气动&#xff0c;因为这个相对而言比较简单。 选择一个4G以下的U盘&#xff0c;最好为2G选择一台XP系统的电脑&#xff08;最好为工控机&#xff0c;必…

XPC调试记录 :TwinCAT生成XML配置文件

XPC调试记录&#xff1a;生成XML配置文件20210316 1.连接目标控制器 硬件准备&#xff1a;用一根网线将配置有EtherCAT的电脑和EK1100&#xff08;BECOHOFF总线模块&#xff09;网线插槽X2(OUT)相连。&#xff08;正常初始化配置时对应指示灯闪烁&#xff09; &#xff08;1&a…