一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就接着来谈谈关于软件测试中的“API定位在不同的方面的定位介绍”。
1. Appium在WEB方面
支持Selenium的子集比如Class、Xpath等,操作同Selenium。
2. Appium在原生态方面
支持Mobile JSON Wire Protocol的策略
l ios uiautomation:一个字符串针对于UiAutomation library(仅限于iOS)做递归元素搜索。
l android uiautomator:一个字符串针对于UiAutomator API(仅限于Android)做递归元素搜索。
l accessibility id:一个字符串针对于ID/NAME(the native Accessibility option utilization)做递归元素搜索。
3.定位API
由于在4.1学习过UiAutomator,这里的定位基本上是一致的。
(1)原生态元素定位
l 通过id定位
语法:
driver.find_element_by_id(String)
对应于UiautomationView中的resource_id
例子:
driver.find_element_by_id("com.example.demo4:id/textView1")
l 通过text定位
语法:
driver.find_element_by_name(String)
对应于UiautomationView中的text
例子:
driver.find_element_by_name("用户名")
l 通过class name定位
语法:
driver.find_element_by_class_name(String)
对应于UiautomationView中的class
例子:
driver.find_element_by_class_name("android.widget.TextView")
l 通过XPath定位
语法:
driver.find_element_by_xpath (String)
例子:
driver.find_element_by_xpath("//android.widget.TextView[contains(@text,'用户名')]")
XPath 在 Appium 上的用法依然很强大,有时需要很长的定位语法,因为APP上元素的class命令本来就长,再加上多层级,结果可想而知。
当果如果出现class 相同的情况下可以用控件的属性值进行区分。
driver.find_element_by_xpath("//android.widget.Button[contains(@text,'7')]")
driver.find_element_by_xpath("//android.widget.Button[contains(@content-desc,'times')]")
driver.find_element_by_xpath("//android.widget.Button[contains(@text,'7')]")
driver.find_element_by_xpath("//android.widget.Button[contains(@content-desc,'equals')]")
l 通过android uiautomator定位(android移动端特有)
语法:
driver.find_element_by_android_uiautomator(new UiSelector().XXX(String))
例子:
driver.find_element_by_android_uiautomator(new UiSelector().text(\"用户名\"))
这里可以参见之前的内容
1)对text属性的方法
driver.find_element_by_android_uiautomator('new UiSelector().text("用户名")')
driver.find_element_by_android_uiautomator('new UiSelector().textContains("户")')
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("用")')
driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^用.*")')
2)对伪xpath属性的方法
driver.find_element_by_android_uiautomator('new UiSelector().text("用户名").fromParent(new UiSelector().text("密码"))') #通过同级元素定位同级元素
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").childSelector(new UiSelector().text("用户名"))') #通过父级元素定位子集元素
3)对class属性的方法
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").text("Custom View")')
driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches(".*TextView$").text("Custom View")')
4)对description属性的方法
driver.find_element_by_android_uiautomator('new UiSelector().description("用户名")')
driver.find_element_by_android_uiautomator('new UiSelector().descriptionStartsWith("用户")')
driver.find_element_by_android_uiautomator('new UiSelector().descriptionMatches("^用户.*")')
5)对resourceId属性的方法
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.example.demo4:id/textView1")')
driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".*id/textView1$")')
l 通过 ios_uiautomation定位(iOS移动端特有)定位
语法:
find_element_by_ios_uiautomation(uia_string)
例子:
driver.find_element_by_ios_uiautomation('.elements()[1].cells()[2]')
(2)HTML5元素定位
HTML5的定位方式同Selenium,在这里仅仅给出个表4-53,不做更多的介绍