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的配置…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
