Appium iOS万能的定位方式--Predicate(iOSNsPredicate)

Posted drewgg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Appium iOS万能的定位方式--Predicate(iOSNsPredicate)相关的知识,希望对你有一定的参考价值。

所谓Predicate定位即Java-Client -5.0.版本以及Appium-Python-Client 0.31版本更新后增加的新的定位方式:

举个例子:

JAVA代码:

//输入账号和密码
driver.findElementByiosNsPredicate("value ==\'11\'").sendKeys("AXPC11@ett.com");

driver.findElementByIosNsPredicate("name == \'login_default_icon\'").click();

driver.findElementByIosNsPredicate("value ==\'请输入登录密码\'").sendKeys("1111");

driver.findElementByIosNsPredicate("name == \'login_default_icon\'").click();

driver.findElement(By.id("登录")).click();

Python代码:

//输入账号和密码
driver.find_element_by_ios_predicate("value ==\'11\'").sendKeys("AXPC11@ett.com");

driver.find_element_by_ios_predicate("name == \'login_default_icon\'").click();

driver.find_element_by_ios_predicate("value ==\'请输入登录密码\'").sendKeys("1111");

driver.find_element_by_ios_predicate("name == \'login_default_icon\'").click();

driver.find_element_by_id("登录")).click();

 

由于使用idclassNameAccessibilityId定位方式较为简单,多数情况下,在同一个页面,都不是唯一存在的,不能识别一个元素。而 xpath定位方式在 xcui 底层原生不支持,由 appium 额外支持的,定位速度很慢,而且有时候定位不到元素的情况存在。综上所述,在 iOS 的 UI 自动化中,使用原生支持的iOSNsPredicateString定位方式是最好,支持也是最好的。

定位方式

iOS 版本全支持,底层测试框架无论是 XCUITest 或 UIAutomation,可支持元素的单个属性和多个属性定位,推荐使用。一个元素有这些属性:typevaluenamelabelenabledvisible,有些元素的属性只有以上的部分属性,如下图所示,可根据这些属性进行元素定位。

元素属性的介绍

type:元素类型,与className作用一致,如:XCUIElementTypeStaticText
value: 一般不用
name:元素的文本内容,可用作 AccessibilityId定位方式,如:测试420班级群
label:绝大多数情况下,与 name 作用一致
enabled:元素是否可点击,一般值为true或者false
visible:元素是够可见,一般值为true或者false

定位方式

元素的定位方式都是一个属性+运算符+值形式存在

  1. 比较运算符:>,<,==,>=,<=,!=
    可用于数值和字符串的比较,
    如:name>100name == \'测试\'

  2. 范围运算符:IN,BETWEEN
    可用于数值和字符串的范围核对
    如:name BETWEEN {3,10}name IN {\'Alan\',\'May\'}

  3. 字符串相关:CONTAINSBEGINSWITHENDSWITH
    包含某个字符串,如:label CONTAINS \'测试\'
    以某个字符串开头,如:label BEGINSWITH \'420\'
    以某个字符串结束,如:label ENDSWITH \'班级群\'
    PS:在三个关键字后加上[c]不区分大小写,可用于字母的校验;[d]不区分发音符号,即没有重音符号($、#、%等);[cd]即不区分大小写,也不区分发音符号,如:name CONTAINS[c] ABcdname CONTAINS abcdname CONTAINS ABCD是等同的,注意后面两个没带[c]的不相等

  4. 通配符:LIKE
    通配符也接受[cd]?代表一个字符,*代表多个字符
    如:一个元素的label属性为

    label LIKE \'420测试班级群\'
    label LIKE \'420?班级群\'
    label LIKE \'420??班级群\'
    label LIKE \'42?测试班?群\'
    label LIKE \'*试班级群\'
    label LIKE \'420测试班*\'
    label LIKE \'42*级群\'
    label LIKE \'4**群\'

    以上这么多种文本都可以被识别为同一个元素。

  5. 正则表达式:MATCHES
    如:以4开头,以结束,

    label MATCHES \'^4.+群$\'

    PS:具体正则表达式语法,请百度一下,你就知道

以一种属性定位元素

可以用元素的属性:typevaluenamelabelenabledvisible,进行定位:

type == XCUIElementTypeStaticText,
label CONTAINS \'测试\'
label LIKE \'*试班级群\'
enabled == true
visible == false

以两种或两种以上属性定位元素

就是以上单个属性定位用符号AND连接起来即可。如:

type == XCUIElementTypeStaticText AND label CONTAINS \'测试
type == XCUIElementTypeStaticText AND label CONTAINS \'测试\' AND enabled == true


原文详见:https://testerhome.com/topics/9405



以上是关于Appium iOS万能的定位方式--Predicate(iOSNsPredicate)的主要内容,如果未能解决你的问题,请参考以下文章

Appium移动端自动化:元素定位方式总结

Appium ios新的定位方式FindsByIosNSPredicate (没有试 先记录在这里) 有个 driver.find_element_by_ios_uiautomation() 研究

Appium自动化测试之IOS模拟器与真机

Appium自动化测试之IOS模拟器与真机

Appium定位方式

Appium定位方式