如何在XCUIElementQuery中获取XCUIElement的索引?

时间:2015-08-23 09:08:01

标签: ios xcode swift xcode-ui-testing ui-testing

这是我简单的UITest (tabbarcontroller中标签的自定义顺序)

func testIsOrderOfTabsSaved() {

    let app = XCUIApplication()
    let tabBarsQuery = app.tabBars
    tabBarsQuery.buttons["More"].tap()
    app.navigationBars["More"].buttons["Edit"].tap()
    tabBarsQuery.buttons["Takeaway"].swipeLeft()
    tabBarsQuery.buttons["In Restaurant"].swipeLeft()

    //here, how to get position of moved button with text "In Restaurant"?

注意

可以通过索引从XCUIElement获取XCUIElementQuery。我可以这样做吗?

3 个答案:

答案 0 :(得分:5)

似乎查询会根据屏幕上的位置自动返回。

for i in 0...tabsQuery.buttons.count {
    let ele = tabsQuery.buttons.elementBoundByIndex(i)
}

索引i代表标签栏中按钮的位置,0是最左边的标签,i == tabsQuery.buttons.count是最右边的。

答案 1 :(得分:4)

您可以通过各种方式创建位置测试。最简单的方法是在索引0和1处获取按钮,然后按名称获取两个按钮并比较数组是否相等:(未经测试编写)

 let buttonOrder = [tabBarsQuery.buttons.elementAtIndex(0), tabBarsQuery.buttons.elementAtIndex(1)]

 let takeawayButton = buttons["Takeaway"];
 let restaurantButton = buttons["In Restaurant"];

 XCTAssert(buttonOrder == [takeawayButton, restaurantButton])

另一种选择是直接获取每个按钮的frame并断言一个X坐标低于另一个。

要回答有关在XCUIElement中获取XCUIElementQuery索引的具体问题,这绝对是可能的。只需遍历查询中的所有元素,并返回第一个等于元素的索引。

答案 2 :(得分:0)

仅XCUIElement不能告诉您它在XCUIElementQuery中的位置。如果您知道有关XCUIElement的知识,则可以搜索XCUIElementQuery以发现其偏移量。在下面,让我们想象“更多”是标识符(如果您正在使用的话,将“标识符”更改为“标签”)。

如果要查找“更多”按钮的偏移量(如原始问题中所述),则:

var offsetWithinQuery : Int? = nil  // optional since it's possible the button isn't found.  
for i in 0...tapBarsQuery.buttons.count{
    if tapBarsQuery.elementAtIndex(i).indentifier == "More" {
       offSetWithinQuery = i
}

退出上述循环后,您将获得偏移量,或者如果未找到“更多”,则为零。