本文是如何使用Shirates的介绍,一种移动测试自动化工具。
选择器表达式
Shirates 选择器表达式是滤波器屏幕元素的表达式。
选择函数接受选择器表达式,解析它们,检索和过滤元素,并返回结果元素。
选择器表达式由一个或多个滤波器表达式。
滤波器表达式
Shirates 滤波器表达式是描述过滤屏幕元素的条件的表达式。
过滤器 | 正式 | 缩写 | android属性 | ios属性 |
---|---|---|---|---|
文本 | text = text1 | text1 | 文本 | 标签 |
textstartswith | textstartswith = text1 | text1* | 文本 | 标签 |
textContains | textContains = text1 | *text1* | 文本 | 标签 |
textendswith | textendswith = text1 | *text1 | 文本 | 标签 |
textmatches | textmatches =^文本$ | n/a | 文本 | 标签 |
字面 | literal = literal1 | 'literal1' | 文本 | 标签 |
ID | id = id1 | #id1 | 资源-ID | 名称 |
访问 | Access = Access1 | @access1 | content-desc | 名称 |
AccessStartswith | AccessStartSwith = Access1 | @access1* | content-desc | 名称 |
AccessContains | AccessContains = Access1 | @*Access1* | content-desc | 名称 |
AccessEndswith | AccessEndswith = Access1 | @*Access1 | content-desc | 名称 |
AccessMatches | AccessMatches =^Access1 $ | n/a | content-desc | 名称 |
value | value = value1 | n/a | 文本 | value |
valuestartswith | valuestartswith = value1 | n/a | 文本 | value |
valuecontains | valuecontains = value1 | n/a | 文本 | value |
valueendswith | valueendswith = value1 | n/a | 文本 | value |
valueMatches | valueMatches =^value1 $ | n/a | 文本 | value |
class | class = class1 | .class1 | class | 类型 |
聚焦 | focusable = true | n/a | 聚焦 | n/a |
滚动 | 滚动= true | n/a | 滚动 | n/a |
可见 | 可见= true | n/a | n/a | 可见 |
XPath | xpath = //*[@text ='text1'] | n/a | (任意) | (任意) |
pos | pos = 2 | [2] | n/a | n/a |
无知型 | ignoretypes = class1,class2 | n/a | class | 类型 |
图像 | image = image1.png | image1.png | n/a | n/a |
了解更多信息
材料
您可以从[https://github.com/wave1008/shirates-samples-selectors]获得完整的示例项目。
selectTest2
import org.junit.jupiter.api.Order
import org.junit.jupiter.api.Test
import shirates.core.driver.branchextension.emulator
import shirates.core.driver.branchextension.realDevice
import shirates.core.driver.commandextension.*
import shirates.core.testcode.UITest
class SelectTest2 : UITest() {
@Test
@Order(10)
fun selectByText() {
scenario {
case(1) {
condition {
it.restartApp()
}.action {
it.select("Network & internet")
}.expectation {
it.textIs("Network & internet")
}
}
case(2) {
action {
it.select("Network &*")
}.expectation {
it.textIs("Network & internet")
}
}
case(3) {
action {
it.select("*internet")
}.expectation {
it.textIs("Network & internet")
}
}
case(4) {
action {
it.select("textMatches=^Network & internet$")
}.expectation {
it.textIs("Network & internet")
}
}
case(5) {
action {
it.selectWithScrollDown("About phone||About emulated device")
}.expectation {
realDevice {
it.textIs("About phone")
}.emulator {
it.textIs("About emulated device")
}
}
}
}
}
@Test
@Order(20)
fun selectById() {
scenario {
case(1) {
condition {
it.restartApp()
}.action {
it.select("#search_action_bar_title")
}.expectation {
it.textIs("Search settings")
}
}
}
}
@Test
@Order(30)
fun selectByAccessibility() {
scenario {
case(1) {
condition {
it.restartApp()
.tap("Network & internet")
}.action {
it.select("@Network & internet")
}.expectation {
it.idIs("collapsing_toolbar")
}
}
}
}
@Test
@Order(40)
fun selectByClass() {
scenario {
case(1) {
condition {
it.restartApp()
}.action {
it.select(".android.widget.ImageButton")
}.expectation {
it.classIs("android.widget.ImageButton")
}
}
}
}
@Test
@Order(50)
fun selectByXpath() {
scenario {
case(1) {
condition {
it.restartApp()
}.action {
it.select("xpath=//*[@text='Search settings']")
}.expectation {
it.textIs("Search settings")
}
}
}
}
@Test
@Order(60)
fun selectByPos() {
scenario {
case(1) {
condition {
it.restartApp()
.tap("Battery")
}.action {
it.select("*Battery*&&[1]")
}.expectation {
it.textIs("Battery Usage")
}
}
case(2) {
action {
it.select("*Battery*&&[2]")
}.expectation {
it.textIs("Battery Saver")
}
}
case(3) {
action {
it.select("*Battery*&&[3]")
}.expectation {
it.textIs("Battery percentage")
}
}
}
}
}
测试结果
结论
Shirates 选择器表达式是简单而功能强大的表达式,可用于在屏幕上检索元素,就像XPATH一样灵活,但比XPath更容易。