【问题标题】:how do you iterate through elements in UI testing in Swift/iOS?你如何在 Swift/iOS 的 UI 测试中迭代元素?
【发布时间】:2016-06-01 23:51:38
【问题描述】:

我知道我可以如何,例如查看表格中的一个元素,但是简单地遍历所有元素(无论找到多少元素)以例如点击它们的正确方法是什么?

let indexFromTheQuery = tables.staticTexts.elementBoundByIndex(2)

【问题讨论】:

  • 表格视图单元格被重复使用,因此除非您使表格视图滚动,否则“屏幕外”的单元格不会被实例化,因此实际上并不存在。
  • 好的,所以有两个问题...在一个屏幕上遍历所有内容的最简单方法是什么...比如说 5 个项目...那么最有效的方法是什么?找到所有这些,然后尝试点击每一个,然后返回到初始表格视图,如果有例如 segue?
  • 对于有限的一组单元格,您可以记录您与应用程序的交互并用作 UI 测试; UI 测试是在 XCode 7 中引入的,see e.g. this tutorial
  • 我实际上只是对查看 for in 循环的语法以及要迭代的项目感兴趣...

标签: ios xcode swift enumeration xctest


【解决方案1】:

好的,我成功地弄清楚了简单的语法。我刚开始使用 Swift,所以我花了很多时间才想到答案。

此代码有效:

var elementLabels = [String]()
for i in 0..<tables.staticTexts.count {
    elementLabels.append (tables.staticTexts.elementBoundByIndex(i).label)
}  
print (elementLabels)

【讨论】:

    【解决方案2】:

    我的猜测是没有办法这样做。

    原因是因为我在进行大量 UI 测试时使用了一个关键的 iOS 组件:UIDatePicker。

    如果您在打开页面的位置记录测试,然后旋转选择器,您会注意到命令都是非特定的并且与屏幕相关。然而,在选择器的情况下,社区请求导致添加了一种进行测试的方法:How to select a picker view item in an iOS UI test in Xcode?

    也许您可以向包含此表的任何控制器添加辅助方法。另外,请记住,您可以轻松地添加方法,而不会污染类接口,只需将它们定义为仅在测试范围内的扩展。

    【讨论】:

      【解决方案3】:

      对于基于 Xcode 11.2.1、SwiftUI 和 swift 5 的应用程序,以下代码用于测试列表,在这种情况下,每个元素在测试代码中显示为一个按钮。表格是这样设置的(对于每一行):

               NavigationLink(destination: TopicDetail(name: "Topic name", longDesc: "A description")) {
                      TopicRow(thisTopic: top).accessibility(identifier: "newTopicRow_\(top.name!)")
                  }
      

      然后我通过将按钮放入数组中来捕获表格的成员:

          let myTable = app.tables.matching(identifier: "newTopicTable")
      
          var elementLabels = [String]()
      
          for i in 0..<myTable.buttons.count {
              elementLabels.append (tablesQuery.buttons.element(boundBy: i).label)
          }
      
          print (elementLabels)
      

      最后,我通过选择具有删除按钮的详细视图删除了表的每个成员,再次使用

      .accessibility(identifier: "deleteTopic"
      

      我想删除表的所有成员:

          for topicLabel  in elementLabels {
      
              let myButton = app.buttons[topicLabel]
      
              myButton.firstMatch.tap()
      
              app.buttons["deleteTopic"].tap()
      
      
          }
      

      【讨论】:

        猜你喜欢
        • 2017-12-29
        • 1970-01-01
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-24
        • 2022-08-05
        • 1970-01-01
        相关资源
        最近更新 更多