IOS自动化测试元素定位

一、元素属性介绍
  1、元素属性
  2、查看各定位方式执行效率

二、iOS常用定位方法
  1、accessibility_id
  2、class_name
  3、Xpath
  4、ios_class_chain(类型链)
  5、ios_predicate(谓词)


一个页面最基本组成单元是元素,想要定位一个元素,我们需要特定的信息来说明这个元素的唯一特征。

一、元素属性介绍
 

iOS自动化元素查找工具,我使用的是Appium的inspector。最新版的appium自动展示多种元素定位表达式,还可以查看每种定位表达式的执行效率。

  1、元素属性
type
元素类型,与className作用一致,如:XCUIElementTypeButton

value
一般不用

name
元素的文本内容,可用作 AccessibilityId定位方式,如:ClearEmail

label
绝大多数情况下,与 name 作用一致

enabled
元素是否可点击,一般值为true或者false

visible

元素是否可见,一般值为true或者false

  2、查看各定位方式执行效率
  Appium的inspector功能中,选择某个元素后在“selected Element”中会展示多个定位表达式,而且点击定位表达式后面的“Get Timing”,可以显示每个定位表达式的执行时间。

二、iOS常用定位方法

  1、accessibility_id


  iOS自动化测试元素定位的accessibility_id主要使用元素的label或name(两个属性的值都一样)属性进行定位。

  例如:第一张截图中label或name都是“我的功能”

driver.find_element_by_accessibility_id("我的功能")
driver.find_element(MobileBy.ACCESSIBILITY_ID,  "我的功能")

  2、class_name


  class_name定位方法使用元素的type属性,type属性表示控件类型,一般不具有唯一性,因此class_name不常用。

  例如:type属性为:XCUIElementTypeButton

driver.find_element_by_class_name("XCUIElementTypeButton")
driver.find_element(MobileBy.CLASS_NAME, "XCUIElementTypeButton")

  3、Xpath
 

Appium对app原生环境的xpath定位方法执行效率很低,从iOS 10开始使用的 XCUITest 框架原生不支持,定位速度很慢,官方不推荐这种方式。但是在实际使用中,当其他定位方式都不能找到元素时,可以尝试xpath定位。

  例如:第一张截图中“我的功能”定位
driver.find_element_by_xpath("//XCUIElementTypeStaticText[@name='我的功能']")
driver.find_element(MobileBy.XPATH, "//XCUIElementTypeStaticText[@name='我的功能']")

  4、ios_class_chain(类型链)


  ios_class_chain仅支持iOS 10或以上,且仅限于WebDriverAgent 框架中使用。此方法用于替代xpath,但该方法还有待完善,没有纳入官方文档。
  Github说明地址:https://github.com/appium/appium-xcuitest-driver

  例如:第一张截图中“我的功能”定位

driver.find_element_by_ios_class_chain('**/XCUIElementTypeStaticText[`label == "我的功能"`]')
driver.find_element(MobileBy.IOS_CLASS_CHAIN, '**/XCUIElementTypeStaticText[`label == "我的功能"`]')


  5、ios_predicate(谓词)


  iOS Predicate 即谓词逻辑。ios_predicate定位方法支持iOS所有的版本,也就是能适配XCUITest 和 UIAutomation底层测试框架,使用的就是iOS编程语言,因此可以把此方法作为首选定位方式。

  谓词表达式由属性、运算符和值构成。

   1.1、常用的属性

   在上面的表格中已经介绍,可以使用的元素属性:type、value、name、label、enabled、visible

   1.2、运算符

   1.2.1、比较运算符

    比较运算符  >, <, ==, >=, <=, !=

   可用于数值和字符串的比较,如:label == ‘我的功能’,label >= 500

   示例:
driver.find_element_by_ios_predicate("label == '我的功能'")
driver.find_element(MobileBy.IOS_PREDICATE, "label == '我的功能'")
driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")


   
   1.2.2、范围运算符

   常用的范围运算符有:


   示例:
driver.find_element(MobileBy.IOS_PREDICATE, "name IN {'id_cell', 'id_alert'}")
driver.find_element_by_ios_predicate("value BETWEEN {5, 7}")
   
   1.2.3、字符串相关


   以字符串“自动化软件测试”为例:

包含某个字符串:label CONTAINS ‘软件’
以某个字符串开头:label BEGINSWITH ‘自动’
以某个字符串结束:label ENDSWITH ‘测试’

  扩展:在三个关键字后加上[c]、或者[d]、[cd]
[c]:表示不区分大小写,可用于字母的校验;
[d]:不区分发音符号,即没有重音符号($、#等);
[cd]:既不区分大小写,也不区分发音符号;

   例如:name CONTAINS[c] ABcd 和  name CONTAINS abcd是等同的

   示例:

driver.find_element_by_ios_predicate("label CONTAINS ‘软件’")
   
   1.2.4、模糊匹配:LIKE

   模糊匹配也可以称为通配符匹配,?代表一个字符,*代表多个字符。
   示例:现有元素的label属性:“自动化软件测试”
   label LIKE ‘自动化软件测试’   # 完全匹配
   label LIKE ‘自动化?件测试’    # ? 匹配一个字符
   label LIKE ‘自动化??测试’    # 两个?号匹配两个字符
   label LIKE ‘自?化?件测试’
   label LIKE ‘*软件测试’      # *代表多个字符
   label LIKE ‘自动化软件*’
   label LIKE ‘自动化*件测*’

   示例:
driver.find_element(MobileBy.IOS_PREDICATE, "label LIKE ‘*软件测试")
   
   1.2.5、逻辑运算符


   1.2.6、正则表达式:MATCHES

   以字符串的匹配为例:匹配字符串“自动化软件测试”,以“自”开头,然后以“试”结尾。

   表达式:label MATCHES ‘^自.+试$’

   示例:
driver.find_element(MobileBy.IOS_PREDICATE, " label MATCHES ‘^自.+试$’")
    
    符号说明: ^  匹配字符串的开头
           .   匹配任意字符,除了换行符
           +  匹配 1 个或多个的表达式。
           $  匹配字符串的末尾
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络服务部署yum仓库

目录 一、网络文件 1.1.存储类型 1.2.FTP 文件传输协议 1.3.传输模式 二、内网搭建yum仓库 一、网络文件 1.1.存储类型 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff0…

01-15

#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);//判断是否有该数据库if(!db.contains("stuInfo.db")){//说明数据库不存在 则创建dbQSqlDatabase::addDatabase("QSQLITE")…

ELK之Filebeat输出日志格式设置及输出字段过滤和修改

一、Filebeat输出日志格式设置 1.1 编辑vim filebeat.yml文件,修改输出格式设置 # output to console output.console:codec.format: string: %{[@timestamp]} %{[message]}pretty: true### 1.2 测试 执行 ./filebeat -e 可以看到/tmp/access.log(目前文件里只有140.77.188…

【LV12 DAY9 ADC实验】

电压在1501mv~1800mv时&#xff0c;LED2、LED3、LED4、LED5点亮 电压在1001mv~1500mv时&#xff0c;LED2、LED3、LED4点亮 电压在501mv~1000mv时&#xff0c;LED2、LED3点亮 电压在0mv~500mv时&#xff0c;LED2闪烁 #include "exynos_4412.h"void delay(unsigned in…

大语言模型系列-总述

大语言模型发展史 研究人员发现&#xff0c;扩展预训练模型&#xff08;Pre-training Language Model&#xff0c;PLM&#xff09;&#xff0c;例如扩展模型大小或数据大小&#xff0c;通常会提高下游任务的模型性能&#xff0c;模型大小从几十亿&#xff08;1 B 10亿&#x…

Mysql判断一个表中的数据是否在另一个表存在

方式一&#xff1a; 判断A表中有多少条数据在B表中【存在】,并且显示这些数据–EXISTS语句 select A.ID, A.NAME from 表A where EXISTS(select * from 表B where A.IDB.ID) 判断A表中有多少条数据在B表中【不存在】&#xff0c;并且显示这些数据–NOT EXISTS语句 select …

使用Go语言通过API获取代理IP并使用获取到的代理IP

目录 前言 【步骤一&#xff1a;获取代理IP列表】 【步骤二&#xff1a;使用代理IP发送请求】 【完整代码】 【总结】 前言 在网络爬虫、数据抓取等场景中&#xff0c;经常需要使用代理IP来隐藏真实的IP地址&#xff0c;以及增加请求的稳定性和安全性。本文将介绍如何使用…

ubuntu22: nvtop no gpu to monitor.

解决方法&#xff1a; 重新下载nvtop sudo apt update sudo apt -y install nvtop真是逆天 &#xff0c;ubuntu系统的nvidia driver突然坏了&#xff0c;然后我重装了nvidia driver, 之后用nvtop就出现这个问题了&#xff0c;但是逆天的是我竟然没有搜到一篇中文的帖子讲这个问…

NLP论文阅读记录 - 2021 | WOS 使用 GA-HC 和 PSO-HC 改进新闻文章的文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试 二.相关工作三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Improved Text Summa…

云卷云舒:2023年,我眼中的十大数据库

我眼中的十大数据库&#xff0c;只要看成长性和演进速度&#xff08;个见勿怪&#xff09;。 一、五强 1、openGauss&#xff1a;生态影响力变大&#xff0c;基于高斯的产品层出不穷 2、OceanBase&#xff1a;只因霸榜&#xff0c;技术强大&#xff0c;新特性更新频繁&#x…

lv14 并发控制:上下文、中断屏蔽和原子变量

1 上下文和并发场合 执行流&#xff1a;有开始有结束总体顺序执行的一段代码 又称上下文 应用编程&#xff1a;任务上下文 内核编程&#xff1a; 任务上下文&#xff1a;五状态 可阻塞 a. 应用进程或线程运行在用户空间b. 应用进程或线程运行在内核空间&#xff08;通过调用…

python基础语法看一篇就够了,全网最全python语法笔记汇总

前言 Python 是一种代表简单思想的语言&#xff0c;其语法相对简单&#xff0c;很容易上手。不过&#xff0c;如果就此小视 Python 语法的精妙和深邃&#xff0c;那就大错特错了。 如能在实战中融会贯通、灵活使用&#xff0c;必将使代码更为精炼、高效&#xff0c;同时也会极…

提前避坑Anzo Capital总结浮动差价的3个缺点

在交易中很多投资者倾向于选择浮动差价模式&#xff0c;这种模式的便利性就不言而喻了&#xff0c;但Anzo Capital需要提醒各位投资者&#xff0c;一定要知道浮动差价的3个缺点&#xff0c;在交易中提前避坑&#xff0c;下面Anzo Capital就和各位投资者一起总结浮动差价的这3…

leetcode 24两两交换链表中的节点

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 思想 对于操作链表节点的时候&#xff0c;首先需要就是创建一个虚拟的…

前端动画特效分享(附在线预览)

分享几款不错的动画特效源码 其中有CSS动画、canvas动画、js小游戏等等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 canvas爱心代码动画 爱心代码动画特效 由里向外不断的产生的小爱心形成一个巨大的爱心动画 以下图片…

Maxwell数据同步(增量)

1. Maxwell简介 1.1 Maxwell概述 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流…

全链路压力测试:现代软件工程中的重要性

全链路压力测试不仅可以确保系统在高负载下的性能和稳定性&#xff0c;还能帮助企业进行有效的风险管理和性能优化。在快速发展的互联网时代&#xff0c;全链路压力测试已成为确保软件产品质量的关键步骤。 1、测试环境搭建 测试应在与生产环境尽可能相似的环境中进行&#xff…

windows使用redis-安装和配置

windows使用redis 安装和配置 下载安装方式一-使用压缩包安装解压到指定的文件Redis安装为Windows服务安装成功 方式二-MSI安装包安装完成 Redis配置远程访问1.修改配置文件redis.windows.conf2.修改完redis配置文件&#xff0c;必须重启redis 下载 先下载Redis for windows 的…

Java lambda表达式如何自定义一个toList Collector

匿名类&#xff1a; package l8;import java.util.*; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; import java.util.s…

【PostgreSQL内核学习(二十二)—— 执行器(ExecutePlan)】

执行器&#xff08;InitPlan&#xff09; 概述ExecutePlan 函数ExecProcNode 函数 总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来…