[facebook-wda]iOS App元素定位
一、定位元素工具weditor
iOS定位工具这里推荐使用weditor,安卓同样可以使用这个工具进行元素连接,appium inspect试过很多次start session连接之后总是提示连接超时,遂放弃使用该工具
二、启动定位工具
参考Android安装环境方法, 使用以下命令安装weditor
pip3 install -U weditor
确保本机已经安装iTunes,并且当前的iOS设备已经连接上且识别到(参考另一篇博文使用tidevice list命令查看)安装完成后使用以下命令开启
python -m weditor
等待网页自动开启,默认显示是这样的
模块选择iOS,默认连接是本地8100接口,点击Connect,发现会出现以下错误
这是由于本机和iOS设备通信失败,此时使用tidevice程序发起和WebDriverAgent之间的通信,保持手机设备可以识别(非锁屏状态),然后运行以下命令
tidevice -u [设备uuid] wdaproxy -B [webdriveragent bundleid] --port 8100[I 220611 13:38:23 _wdaproxy:125] [设备uuid] WDA check every 30.0 seconds
[D 220611 13:38:23 _wdaproxy:131] [设备uuid] launch WDA
[I 220611 13:38:24 _device:969] BundleID: [webdriveragent bundleid]
[I 220611 13:38:24 _device:985] ProductVersion: 12.5.5
[I 220611 13:38:24 _device:986] DeviceIdentifier: [设备uuid]
[I 220611 13:38:24 _device:822] SignIdentity: 'Apple Development: xxxxxxxxx@qq.com (2PQLXK79WG)'
[I 220611 13:38:24 _device:828] CFBundleExecutable: WebDriverAgentRunner-Runner
[I 220611 13:38:24 _device:859] AppContainer: /private/var/mobile/Containers/Data/Application/A26DF5B4-203E-4035-9D81-10CC86564A1A
[I 220611 13:38:24 _device:899] Launch '[webdriveragent bundleid]' pid: 986
[I 220611 13:38:25 _device:1035] Test runner ready detected
[I 220611 13:38:25 _device:1027] Start execute test plan with IDE version: 29
[I 220611 13:38:26 _device:935] WebDriverAgent start successfully
等待WDA启动之后,再次点击Connect发现weditor可以正常同步iOS设备,Connect右侧的绿色树叶图标代表已经成功连接
接下来就可以打开需要测试的App进行元素定位了
三、WDA初始化
全局配置
import wdawda.DEBUG = False # default False
wda.HTTP_TIMEOUT = 180.0 # default 180 seconds
wda.DEVICE_WAIT_TIMEOUT = 180.0
创建一个客户端
import wdawda.DEBUG = False # default False
wda.HTTP_TIMEOUT = 180.0 # default 180 seconds
wda.DEVICE_WAIT_TIMEOUT = 180.0client = wda.Client('http://localhost:8100') # url参数为默认为: http://localhost:8100, 可以修改为其他端口或者ip
设备操作
接上面创建客户端的代码,执行前确认WDA服务正常
打开功能菜单或者App
client.session("appname") # app_name可以通过tidevice applist进行查看# 这里我们以打开iOS设备的设置菜单为例
client.session('com.apple.Preferences')# 还可以通过USBClient连接
client = wda.USBClient() # 仅连接一个设备可以不传参数
client = wda.USBClient("设备udid", port=8100) # 指定设备 udid 和WDA 端口号
client = wda.Client("http+usbmux://{udid}:8100".format(udid="udid")) # 通过DEVICE_URL访问
client = wda.USBClient("udid", port=8100, wda_bundle_id="webdriveragent bundleid") # 引入 wda_bundle_id 参数
针对USBClient(),初始化连接设备时不需要事先使用tidevice命令启动WDA,wda.Client()会自动启动WDA应用,确认iOS设备的设置菜单被打开
关闭功能菜单或者App
client.close() # 关闭# 还可以使用app_terminate
client.app_terminate('com.apple.Preferences') # 停止App命令
设备控制
# 回到手机主页面
client.home()
client.press("home")# 增大降低音量
client.press("volumeUp")
client.press_duration("volumeUp", 1) # 长按1s音量上键
client.press("volumeDown")
client.press_duration("volumeDown", 1) # 长按1s音量下键# 锁屏
client.locked() # 返回锁定状态True/False
client.lock() # 锁屏
client.unlock() # 解锁
获取设备应用信息
# 查看设备状态信息
client.status()# 获取应用信息
client.app_current()# 获取设备信息
client.device_info()# 获取电量信息
client.battery_info()# 获取分辨率
client.window_size()
四 、元素定位
通过属性值进行定位
id
client(id='element_id')
className
client(className="element_className")
name
client(name="element_name")
value
client(value="element_value")
label
client(label="element_label")
client(labelContains="element_label_content")
组合定位
可以进行多个属性组合进行定位,例如:
client(className="element_className", name="element_name")
子元素定位
# 子元素定位
client(className='element_className').child(name='child_element_name').exists
XPath
XPath是XML路径语言,是一种查询语言,使用路径表达式浏览XML文档中的元素和属性。XPath标准语法如下:
XPath=//tagname[@attribute='value']
// : 选择当前节点
tagname: 节点标签名
@: 选择属性
Attribute: 节点属性名
Value: 属性值
示例如下:
client(xpath='//*[@name="element_name"]')
# 或者
client.xpath('//*[@name="element_name"]')
Predicate定位
Predicate定位是iOS原生支持的定位方式,定位速度比较快,它可以通过使用多个匹配条件来准确定位某一个或某一组元素
基本比较
符号 | 说明 | 示例 |
= , ==
|
等于 | name == “通知” |
>
|
大于 | name > 10 |
<
|
小于 | name < 10 |
>= , =>
|
大于等于 | name >= 10 |
<= , =<
|
小于等于 | name <= 10 |
!= , <>
|
不等于 | name != “通知” |
集合操作
符号 | 说明 | 示例 |
ANY , SOME | 满足表达式的任意元素 | ANY children.age < 18 |
ALL | 满足表达式的所有元素 | ALL children.age < 18 |
NONE | 不包含满足表达式的任意元素 | NONE children.age < 18 |
IN | 元素在集合中 | name IN { ‘Ben’, ‘Melissa’, ‘Nick’ } |
BETWEEN | 位于某个范围 | 1 BETWEEN { 0 , 33 } |
array[index] | 数组array中指定索引的元素 | |
array[FIRST] | 数组中的第一个元素 | |
array[LAST] | 数组中的最后一个元素 | |
array[SIZE] | 指定数组大小 |
布尔值
符号 | 说明 | 示例 |
TRUEPREDICATE | TRUE | |
FALSEPREDICATE | FALSE |
逻辑运算符
符号 | 说明 | 示例 |
AND, && | 逻辑与 |
name="通知" AND label="通知"
|
OR, || | 逻辑或 | |
NOT, ! | 逻辑非 |
字符串比较
关键字 | 说明 | 示例 |
BEGINSWITH | 以某个字符串开始 |
name BEGINSWITH "屏幕"
|
ENDSWITH | 以某个字符串结束 |
name ENDSWITH "时间"
|
CONTAINS | 包含 |
name CONTAINS "使用时间"
|
LIKE | 通配符 |
name LIKE '*Total: $*'
|
MATCHES | 正则匹配 |
value MATCHES '.*of 7'
|
默认情况下,字符串比较是大小写和变音敏感的,可以在关键字后面加上
[cd]
,[c]
不区分大小写,[d]
表示不区分变音符号变音符号是附加在字母上的符号,用于提示发音或区分相似的单词。很多语言使用变音符,比如法语、西班牙语等。比如法语单词:Pêche 桃子
classChain定位
classChain是Predicate和Xpath定位的结合,搜索效率比XPath更高
class chain 定位方法由mykola-mokhnach开发,和XPath比较类似,可以实现分层查询,但它的查询性能更高,通过将class chain查询映射到一系列的XCUITest调用中,仅查找子节点,不像XPath那样递归地查询整个UI树
儿子节点搜索
选择儿子元素,类似于XPath语法中的反斜杠/,示例如下:
XCUIElementTypeWindow[`label BEGINSWITH "text"`][-1] # 选择label以foo开头的最后一个
XCUIElementTypeWindow/XCUIElementTypeButton[3] # 选择window的儿子元素XCUIElementTypeButton的第3个(索引从1开始)
XCUIElementTypeWindow/*[3] # 选择window的第3个儿子元素
XCUIElementTypeWindow # 选择所有子窗口
XCUIElementTypeWindow[2] # 选择第二个窗口
XCUIElementTypeWindow[2]/XCUIElementTypeAny # 选择第二个子窗口的所有子元素
子孙节点搜索
类似于XPath语法中的双反斜杠//,示例如下:
**/XCUIElementTypeCell[`name BEGINSWITH "A"`][-1]/XCUIElementTypeButton[10] # 选择name以A开头的最后一个Cell元素的第10个子元素
**/XCUIElementTypeCell[`name BEGINSWITH "B"`] # 选择name以B开头的所有Cell元素
**/XCUIElementTypeCell[`name BEGINSWITH "C"`]/XCUIElementTypeButton[10] # 选择name以C开头的第一个Cell元素的第10个子元素
**/XCUIElementTypeCell[`name BEGINSWITH "D"`]/**/XCUIElementTypeButton # 选择name以D开头的第一个Cell元素下所有后代Button
五、元素
单个元素实例
client(定位元素).find_elements()
多个元素实例
client(nameCntains='element_name').find_elements()
还可以通过索引返回单个元素实例
client(nameCntains='element_name', index=2).find_elements() # 返回匹配的第三个元素
# 或者
client(nameCntains='element_name')[2].find_elements()
判断元素是否存在
client(定位元素).exists # 返回True或者False
获取元素属性
element = client(元素定位)# 获取元素属性有以下几类,返回结果以实际为准
element.className # XCUIElementTypeButton属性
element.name # XCUIElementTypeButton属性
element.visible # True
element.value # 空
element.label # label元素名称
element.text # 当前定位元素方式内容
element.enabled # True
element.displayed # True
element.accessible # Truex, y, w, h = element.bounds # Rect(x=, y=, width=, height=)
六、元素操作
点击元素click\tap
# 元素点击
client(定位方式).tap()
client(定位方式).tap_hold(2.0) # 长按2秒
client(定位方式).click()
client(定位方式).click_exists() # 返回True或者False
client(定位方式).click_exists(timeout=5.0) # 超时等待5秒#坐标点击
client.tap(x, y) # 通过坐标进行点击
client.click(x, y) # 通过坐标进行点击
client.double_tap(x, y) # 双击
输入set_text/清除clear_text
element= client(元素定位)# 输入
element.set_text('contenct')# 清除
element.clear_text()# 删除多个字符
element.set_text("\b\b\b\n") # 删除3个字符# 输入文本+确认
element.set_text('contenct\n') # \n为确认,类似于输入完按Enter换行
滑动swipe
WDA的滑动方式有两种 ,一个是根据坐标滑动,一个是安装方向滑动
client.swipe(fx, fy, tx, ty, duration=0.5) # 从(fx, fy)滑到(tx, ty),坐标值可以是迅速值或者百分比,duration单位秒
client.swipe_left() # 向左滑动
client.swipe_right() # 向右滑动
client.swipe_up() # 向上滑动
client.swipe_down() # 向下滑动
[facebook-wda]iOS App元素定位相关推荐
- xpath定位元素方法_测试数十次,总结了APP元素定位的万能方法
定位不到元素时候,一定很头大,最近一直在跑自动化流程,经常因为各种原因定位不到元素,经过数十次的尝试,我发现尤其是H5页面,出现定位不到元素的可能性更大,也总结尝试发现了在H5里面,通过切换上下文后用 ...
- APP元素定位操作API
1.Appium常用元素定位方式 name value id id属性值 class class属性值 xpath xpath表达式 2.前置代码 from appium import webdriv ...
- APP元素定位工具Weditor连接夜神模拟器
本文内容参考此文章:https://blog.csdn.net/junqing124/article/details/108873303 1.安装 pip install uiautomator2 p ...
- APP自动化基础之元素定位
mobileby 在开始讲元素定位的方式时,我们先来看下appium中元素定位的相关模块:mobileby.py: 在这里可以看到,MobileBy这个类继承了selenium中的元素定位的类:By, ...
- Appium元素定位操作app
1.APP元素定位操作 1.Appium常用元素定位方式 2.前置代码 from appium import webdriver# 启动参数 caps = {} # 设备信息 caps["p ...
- App自动化元素定位技巧__根据 XPATH 定位
App元素定位技巧__根据 XPATH 定位 1.根据 XPATH 定位. 1.1.Xpath在appium中的原理: 在Appium中,我们没法使用css,因为css是 web 专用的,与web不同 ...
- rf中resourceid_RF(三)元素定位方法
经过较长时间的自动化编写,个人认为,UI自动化的精髓除了设计思路,那就是元素定位了!接下来就介绍常用的定位方法以及写法! 一.APP元素定位工具及写法 还记得RF(一)中,安装过一个Android S ...
- App控件定位:Android 控件介绍及元素定位方法
本文将分享Android相关基础知识和Android APP控件定位工具的使用方法. 目录 Android基础知识 Android布局 Android四大组件 1.activity 2.Service ...
- App自动化元素定位不到?别慌,3大工具帮你解决
在日常的android app自动化测试工作当中,很多朋友在元素定位时,会遇到以下类似的报错: 然后会来问,这是啥情况? 一般情况下,都会送上以下亲切的关怀: 1)adb能识别到设备吗? 2)设备有被 ...
- 解决Xcode couldn‘t find any iOS App Development provisioning profiles matching ‘com.facebook.WebDriver
① 目的: 昨天还好好的,今天早上环境启动好无法启动手机APP了. 但是使用模拟器好好地. ② 环境 Python+appium+IOS真机 ③ 错误信息 3.1错误信息: Xcode couldn' ...
最新文章
- 【Python】SyntaxError: unexpected EOF while parsing
- 聊聊storm supervisor的启动
- Spring AOP底层实现原理
- kickstart 安装CentOS GPT分区的完整ks示例
- HTML5 —— 本地存储
- 清理操作系统垃圾批处理文件
- 《趣题学算法》—第1章1.2节简单的数学计算
- 在 Mac 上如何将 Better Zip 设置为自动更新?
- 16个 Redis 常见使用场景,面试有内容聊啦
- aiohttp 高并发web服务_面试官要是问你如何解决web高并发,你就这样回答
- scala(13)-----集合(Collection)-------列表
- 详解《云原生架构白皮书》,附下载链接
- 「大数据成神之路」第四版更新完毕
- 解决浏览器 fakepath 实现图片上传预览
- .net MVC全局定时器执行作业
- 强行调用html5,Html5踩坑记之mandMobile使用小记
- 计算机死机后 通过任务管理器关闭程序,电脑死机后,按哪个键结束程序
- taptap领礼包怎么显示服务器繁忙,原神taptap预约奖励领取教程 taptap预约奖励怎么领取...
- flutter下载慢
- 594. 最长和谐子序列--Python
热门文章
- 苹果手机如何用计算机,电脑怎么控制iPhone手机
- Android包管理机制(一) PackageInstaller的初始化
- mysql2000数据库四合一_sql2000四合一版下载|microsoft sql server2000 简体中文4合一版附sql 2000 sp4 补丁_ - 极光下载站...
- 计算机系统下的审计系统,独立审计具体准则第20号——计算机信息系统环境下的审计...
- 网络流量监测IP雷达 4.0
- kettle软件的使用
- 基本计算机编程术语,计算机编程术语,你记住了吗?
- 我的世界服务器标记家位置,我的世界:你真的会看藏宝图吗?学会用标记,位置一次就找对...
- MySQL5.0安装图文教程
- ElasticJob 3.0 带你快速入门