如何在Shirates中使用选择器表达式
#android #ios #appium #testautomation

本文是如何使用Shirates的介绍,一种移动测试自动化工具。

选择器表达式

Shirates 选择器表达式是滤波器屏幕元素的表达式。

选择函数接受选择器表达式,解析它们,检索和过滤元素,并返回结果元素。

选择器表达式由一个或多个滤波器表达式

Example

滤波器表达式

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

了解更多信息

参见Selector expression

材料

您可以从[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")
                }
            }
        }
    }

}

测试结果

Result1

Result2


结论

Shirates 选择器表达式是简单而功能强大的表达式,可用于在屏幕上检索元素,就像XPATH一样灵活,但比XPath更容易。