Appium(四)
一、app页面元素定位
1、通过id定位元素: resrouce-id2、通过ClassName定位:classname3、通过AccessibilityId定位:content-desc4、通过AndroidUiAutomator定位5、通过xpath定位xpath、id、class、accessibility id、android uiautomatorUI AutomatorUI自动化测试框架,安卓移动端app要求:Android 4.3以上提供了一系列API:执行UI测试在系统或者第三方app上面允许在被测设备上执行操作,比如打开系统设置菜单适合编写黑盒自动化测试UI Automator框架的主要特点:1、元素定位:UI Automator Viewer:扫描、分析待测应用的UI组件的图像工具。2、元素操作:Accessing device state:在目标设备和app上的各种操作3、元素识别:UI Automator APIs:在多个应用程序中捕获和操作UI组件使用UIAutomator中的UiSeletor类来处理元素定位在python客户端appium库中通过,uiautomator来获取元素的方法为:driver.find_elements_by_android_uiautomator()该方法的参数为UiSeletor类定位元素的表达式:new UiSelector().函数名称("定位表达式")实例化一个UiSeltctor对象,然后通过示例调用接口示例:需要导入包:from appium.webdriver.common.appiumby import AppiumBydriver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceId("com.tencent.mobileqq:id/dialogLeftBtn")')
二、滑动屏幕
滑动接口:
swipe(起始X,起始Y,结束X,结束Y)
结束X-起始X:X轴滑动的距离
结束Y-起始Y:Y轴滑动的距离手机的屏幕尺寸有很多,如何兼容?
get_window_size() 获取屏幕大小,返回的是一个字典
如:
size=driver.get_window_size()
print(size)
返回的结果为:
{'width': 1080, 'height': 1920}
# 滑屏操作
# get_window_size() 获取屏幕大小,返回的是一个字典
size=driver.get_window_size()
# 向右滑屏
driver.swipe(size["width"]*0.8,size["height"]*0.5,size["width"]*0.2,size["height"]*0.5,100)
sleep(2)
print("滑屏到热点")
三、appium----模拟触屏
TouchAction类(从Appium2.0 TouchAction被弃用)
将一些列的动作放在一个链条中,然后将该链条传递给服务器。服务器接收到该链条后,解析各个动作,逐个执行。
短按(press)
长按(longPress)
点击(tap)
移动到(move_to) x,y为相对上一个坐标的移动距离
等待(wait)
释放(release)
执行(perform)
取消(cancel)

from appium.webdriver.common.touch_action import TouchAction
ele=driver.get_element(AppiumBy.ID,"")
# 元素的大小 返回的是一个字典{"width":xxx,"height":xxx}
size=ele.size
# 正方形 所以宽高的步长一样
step=size["width"]/6
# 元素的起始坐标-左上角
ori=ele.location
point1=(ori["x"]+step,ori["y"]+step)
point2=(point1[0]+step*2,point1[1]) # 相对于point1,x轴增加了2*step
point3=(point2[1]+step*2,point2[1]) # 相对于point2,x轴增加了2*step
point4=(point3[1]-step*2,point3[1]+step*2) # 相对于point3,x轴减少了2*step,y轴增加了2*step
point5=(point4[1],point4[1]+step*2) # 相对于point3,x轴不变,y轴增加了2*stepTouchAction(driver).press(x=point1[0],y=point1[1]).wait(200).\move_to(x=point2[0],y=point2[1]).wait(200).\move_to(x=point3[0],y=point3[1]).wait(200).\move_to(x=point4[0],y=point4[1]).wait(200).\move_to(x=point5[0],y=point5[1]).wait(200).\release().\perform()
appium-python-client的版本为4.0.1,这个版本中,好像没有touchaction的包,因此,使用w3c来代替操作
from selenium.webdriver import ActionChains
1、实例化:
从之前的action = TouchAction(driver)改为
action = ActionChains(driver)
2、按压操作
从之前的action.press()改为:
action.w3c_actions.pointer_action.click_and_hold()
3、等待操作
从之前的action.wait()改为:
action.w3c_actions.pointer_action.pause(2)
4、释放操作:
从之前的action.release()改为:
action.w3c_actions.pointer_action.release()
5、执行操作不变,依旧为action.perform()。
四、Toast消息提示框
Toast是一种简易的消息提示框,通常用于向用户显示信息。Toast消息不能被用户点击,并且会根据所设置的显示时间自动消失。
不会获得焦点,无法被点击,并且显示时间有限,一般会在几秒内自动消失。
Toast消息通常用于提示用户某些操作的结果或状态,例如密码输错后的提示。要获取Toast信息要满足
Appium对Toast的支持:
(1)Appium从1.6.3版本开始支持识别Toast内容,这主要是基于UiAutomator2的。因此,在使用Appium获取Toast消息时,需要在Capability配置中添加参数'automationName': 'UIAutomator2'
(2)UIAutomator2只支持安卓5.0以上的版本xpath表达式:
xpath="//*[contains(@text,'文本内容')]"
注意:driverWait方法中,请用presence_of_element_located,不要用visibility_of_element_located,对toast的可见处理并不支持,会直接报错命令无法执行

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
desired_caps={"deviceName": "127.0.0.1:5555","platformName": "Android","platformVersion": "7.1.2","appPackage": "com.ss.android.article.news","appActivity": ".activity.MainActivity","automationName":"UiAutomator2"
}
# 连接appium server。前提:appium desktop要启动。有监听窗口
# 将desired_caps发送给appium server。打开appdriver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
# 运行代码之前:
# 1、appium server启动成功。处于监听状态;
# 2:模拟器/真机必须能够被电脑识别。即adb devices能够识别到要操作的设备。
# 通过resource-id定位
# 等待进入首页,看到推荐
WebDriverWait(driver,20).until(EC.visibility_of_element_located((AppiumBy.ACCESSIBILITY_ID,"推荐"))
)
print("可以看到推荐")
# 进行登录操作
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("未登录").resourceId("com.ss.android.article.news:id/ctd")').click()
sleep(0.5)
# 等待登录页面出现
WebDriverWait(driver,20).until(EC.visibility_of_element_located((AppiumBy.ID,"com.ss.android.article.news:id/ctb"))
)
driver.find_element(AppiumBy.ID,"com.ss.android.article.news:id/c04").click()
sleep(0.5)
# 找到账号密码登录
WebDriverWait(driver,20).until(EC.visibility_of_element_located((AppiumBy.ID,"com.ss.android.article.news:id/ro"))
)
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("密码登录").resourceId("com.ss.android.article.news:id/bhu")').click()
sleep(0.5)
# 进入账号密码登录页面
WebDriverWait(driver,20).until(EC.visibility_of_element_located((AppiumBy.ID,"com.ss.android.article.news:id/bhh"))
)
driver.find_element(AppiumBy.ID,"com.ss.android.article.news:id/bhh").send_keys("18435990207")
driver.find_element(AppiumBy.ID,"com.ss.android.article.news:id/bhp").send_keys("123")
driver.find_element(AppiumBy.ID,"com.ss.android.article.news:id/qa").click()
sleep(0.5)
xpath='//*[contains(@text,"访问太")]'
try:WebDriverWait(driver,10,0.02).until(EC.presence_of_element_located((AppiumBy.XPATH,xpath)))print(driver.find_element(AppiumBy.XPATH,xpath).text)
except:print("没有找到Toast")
运行结果:访问太频繁,请稍后再试
五、混合应用-H5
目前主流用用程序分为三类:Web App(网页应用)、Hybrid App(混合应用)、Native App(原生应用)怎么样分辨一个app页面究竟是native还是web的?
1、在手机/模拟器中点击手机号的版本号5下,进入开发者选项
2、在开发者选项中勾选上显示布局边界,再返回到App界面
3、如果App是web的界面,那界面不会有布局边界显示,如有则说明是native的界面
或者通过定位工具 点中间没有原生部件的地方,看class值

基于UIAutomator+Chromedriver
native部分则uiautomator,webview部分走chromedriver,二者结合要求:
android 4.4+
webview必须为debug版本获取webview页面的三种方式:
1、chrome://inspect,需要翻墙
2、使用driver.page_source获取html页面
3、找开发人员要源文件
4、uc-devtools 不需要翻墙(推荐)
常见问题:
contexts只能获取NATIVE_APP ,无法获取WEBVIEW
使用uiautomatorviewer定位元素,显示class值为:android.webkit.WebView
但是driver.contexts只打印出‘NATIVE_APP’
解决方法:
1、app打包的时候需要开发webview的debug属性setWebContentDebuggingEnableed(true),这个直接让开发加上就好
2、模拟器的有些contexts中有webdriver,但有些手机没有。
官方给出的答案是:需要将手机root,然后再去获取。
开启webview可见:
https://developers.google.com/web/tools/chrome-devtools/remote-debugging/webviews
上下文切换:
可用的上下文(Contexts)
列出所有可用的上下文(contexts)
driver.contextsdriver.window_handles
当前上下文(Context):列出当前的上下文
driver.current_context切换到默认的上下文(Context)
切换回默认的上下文(Context)。(一般就是原生上下文"NATIVE_APP")
driver.switch_to.context(None)当前Activity:获取当前的Activity。仅支持Android
driver.current_activity当前包名(package):获取当前包名(package)。仅支持Android
driver.current_package


如果出现这种情况,这好换Appium版本

关注:https://www.cnblogs.com/yyoba/p/9455519.html
小程序

相关文章:
Appium(四)
一、app页面元素定位 1、通过id定位元素: resrouce-id2、通过ClassName定位:classname3、通过AccessibilityId定位:content-desc4、通过AndroidUiAutomator定位5、通过xpath定位xpath、id、class、accessibility id、android uiautomatorUI AutomatorUI自…...
简单的sql注入 buuctf
lovesql 这道题是一个非常简单的sql注入 也就是万能密码 我们只需要注意在输入用户名的地方使用 ’ 将语句提前终止 并且or一个为真的条件 这样整个语句的结果就为真 这就是万能密码的原理 这样我们就得到了密码 然后我们发现这只是密码 于是查看一下字段数 尝试下注入 这里我…...
Ubuntu 24.04 LTS 空闲硬盘挂载到 文件管理器的 other locations
Ubuntu 24.04 LTS 确认硬盘是否被识别 使用 lsblk 查看信息,其中sda这个盘是我找不到的,途中是挂在好的。 分区和格式化硬盘 如果新硬盘没有分区,你需要先分区并格式化它。假设新硬盘为 /dev/sdb,使用 fdisk 或 parted 对硬盘…...
<电子幽灵>开发笔记:BAT基础笔记(一)
BAT脚本基础笔记(一) 介绍 费曼学习法最重要的部分,即把知识教给一个完全不懂的孩子——或者小白。 为了更好的自我学习,也为了让第一次接触某个知识范畴的同学快速入门,我会把我的学习笔记整理成电子幽灵系列。 提示:作为低代码…...
PiliPalaX ( 第三方安卓哔哩哔哩)
PiliPalaX 是一款哔哩哔哩第三方客户端。使用 Flutter 开发,基于PiliPala原版基础上创作出来的X升级版,目前支持Android、IOS客户端。 应用特色 目前着重移动端(Android、iOS)和Pad端,暂时没有适配桌面端、手表端等 https://pan.quark.cn/s/…...
在亚马逊云科技上高效蒸馏低成本、高精度的Llama 3.1 405B模型(上篇)
在2024年的亚马逊云科技re:Invent全球云计算春晚里,亚马逊云科技CEO - Matt Garman介绍了亚马逊云科技的AI模型托管平台Amazon Bedrock上的模型蒸馏服务Model Distillation,令小李哥印象十分深刻。该功能可自动化地为特定场景的知识创建一个蒸馏模型。它…...
Amazon MSK 开启 Public 访问 SASL 配置的方法
1. 开启 MSK Public 1.1 配置 MSK 参数 进入 MSK 控制台页面,点击左侧菜单 Cluster configuration。选择已有配置,或者创建新配置。在配置中添加参数 allow.everyone.if.no.acl.foundfalse修改集群配置,选择到新添加的配置。 1.2 开启 Pu…...
LeetCode_438.找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "a…...
一文读懂服务器的HBA卡
什么是 HBA 卡 HBA 卡,全称主机总线适配器(Host Bus Adapter) ,是服务器与存储装置间的关键纽带,承担着输入 / 输出(I/O)处理及物理连接的重任。作为一种电路板或集成电路适配器,HBA…...
Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化
Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化 源数据库Kafka Connect监控测试结果 源数据库 Oracle 19c,本地,CDB数据库主机的I/O带宽为6 GB/s,由此主机上运行的所有数据库共享临时表空间由42个文件组成&#x…...
深度学习 Pytorch 基本优化思想与最小二乘法
在正式开始进行神经网络建模之前,我们还需要掌握pytorch中最核心的基础数学工具——autograd(自动微分)模块。虽然对于任何一个通用的深度学习框架都会提供许多自动优化的算法和现成的loss function,但如果想更深入理解神经网络,对深度学习的…...
C# 实现系统信息监控与获取全解析
在 C# 开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途。比如在系统性能优化工具中,需要实时读取 CPU、GPU 资源信息;在一些特殊的输入记录程序里,可能会涉及到键盘监控;而在图形界面开发中…...
Transformer详解:Attention机制原理
前言 Hello,大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者,本系列文章是作者参加DataWhale2025年1月份学习赛,旨在讲解Transformer模型的理论和实践。😲 本文将详细探讨Attention机制的原理…...
网络安全技术深度解析与实践案例
网络安全技术深度解析与实践案例 随着信息技术的飞速发展,网络已成为现代社会不可或缺的一部分。然而,网络空间的开放性也带来了各种安全隐患。为了保障网络和数据的安全,网络安全技术显得尤为重要。本文将深入探讨网络安全技术的核心要素,并通过Python代码示例展示其具体…...
JavaScript中提高效率的技巧一
1.生成随机颜色的两种方式 1).生成RandomHexColor const generateRandomHexColor () > {return #${Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, 0)} } generateRandomHexColor() // #a8277c generateRandomHexColor() // #09c20c generat…...
美食推荐系统 协同过滤余弦函数推荐美食 Springboot Vue Element-UI前后端分离
个性化美食推荐系统 协同过滤余弦函数推荐美食 Echart数据统计 Springboot Vue Element-UI前后端分离 【亮点功能】 1.SpringbootVueElement-UIMysql前后端分离 2.Echarts图表统计数据, 直观展示数据情况 3.发表评论后,用户可以回复评论, 回复的评论可以被再次回复,…...
ThinkPHP 8的一对多关联
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...
Django简介与虚拟环境安装Django
目录 1.Django简介 1.1 Django 的核心特点 1.2 Django 的核心组件 1.3 Django 的应用场景 1.4 总结 2.基础环境建立 2.1 创建虚拟环境 2.1.1 使用 virtualenv 创建虚拟环境 2.1.2 使用 venv 创建虚拟环境 2.2 激活虚拟环境 2.2.1 在 Windows 上 2.2.2 在 macOS 或 …...
Redis延迟队列详解
以下是对 Redis 延迟队列的详细解释: 一、什么是 Redis 延迟队列 Redis 延迟队列是一种使用 Redis 实现的消息队列,其中的消息在被消费之前会等待一段时间,这段时间就是延迟时间。延迟队列常用于一些需要延迟处理的任务场景,例如订…...
一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用
一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用 1. 建议按文章顺序从头看是看 第一篇:一文大白话讲清楚啥是个webpack第二篇:一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建然后看本篇,Loader的配置…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
