如何在iOS UI测试中查询“主窗口”?

时间:2018-07-05 11:53:59

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

在测试中的某一时刻,我需要与Main Window内部的视图进行交互。当我做po app.windows时,我得到了:

Find: Target Application 0x1c40d7680
  Output: {
    Application, 0x1c4389170, pid: 4765, {{0.0, 0.0}, {375.0, 667.0}}, label: 'Mercedes PRO [testb2b]'
  }
  ↪︎Find: Descendants matching type Window
    Output: {
      Window, 0x1c43890a0, {{0.0, 0.0}, {375.0, 667.0}}
      Window, 0x1c438dc30, {{0.0, 0.0}, {375.0, 667.0}}
      Window, 0x1c438dea0, {{0.0, 0.0}, {375.0, 667.0}}
      Window, 0x1c438e6c0, Main Window, {{0.0, 0.5}, {375.0, 667.0}}
    }

我需要查询Main Window,因为该列表的第一个窗口中的视图几乎相同,因此我想将它们分开。因此,我尝试使用app.windows["Main Window"]进行查询,但似乎Main Window不是窗口视图的标识符。

打印所有XCUIElementAttributes(例如titlevalueidentifier等)并不能给我太多信息(它们主要是空字符串)。另外,我也不想按位置查询它(例如:app.windows.element(boundBy: 3)),因为我不确定此Window是否将始终位于此位置。

还有另一种查询Main Window的方法吗?

2 个答案:

答案 0 :(得分:0)

我发现最好的方法是使用它们的框架大小过滤窗口。

let window = app.windows.allElementsBoundByIndex.first { element in
                element.frame.width > 10
            }!

如果找到更好的方法,我将对其进行编辑。

答案 1 :(得分:0)

我试图实现的是将标识符添加到window对象。我尝试将其添加到ViewController中,该视图显示了我正在尝试使用以下代码行查询的视图(在viewDidLoad()中):

UIApplication.shared.delegate?.window??.accessibilityIdentifier = "Main Window"

我一直在错误的位置获取标识符:

Find: Target Application 0x60c0000c1260
  Output: {
    Application, 0x60c00018c640, pid: 33496, {{0.0, 0.0}, {414.0, 736.0}}, label: '[testb2b]'
  }
  ↪︎Find: Descendants matching type Window
    Output: {
      Window, 0x60c00018c710, {{0.0, 0.0}, {414.0, 736.0}}, identifier: 'Main Window'
      Window, 0x60c000191370, {{0.0, 0.0}, {414.0, 736.0}}
      Window, 0x60c0001915e0, {{0.0, 0.0}, {414.0, 736.0}}
      Window, 0x60c000191c60, Main Window, {{0.0, 0.5}, {414.0, 736.0}}
    }

然后我在代码中找到了一个位置,开发人员在其中创建了一个用于保存该VC的新窗口。

let actionVC = UIStoryboard.findViewController(withIdentifier: "ActionViewController")
if let appWindow = UIApplication.shared.delegate?.window {
     let window = UIWindow.init(frame: appWindow.frame)
     window.rootViewController = actionVC
     window.accessibilityIdentifier = "Main Window"
}

这使我可以编写如下查询:app.windows["Main Window"],并确保我以真正的Main Window为目标。

Find: Target Application 0x60c0000c1260
  Output: {
    Application, 0x60c00018c640, pid: 33496, {{0.0, 0.0}, {414.0, 736.0}}, label: '[testb2b]'
  }
  ↪︎Find: Descendants matching type Window
    Output: {
      Window, 0x60c00018c710, {{0.0, 0.0}, {414.0, 736.0}}
      Window, 0x60c000191370, {{0.0, 0.0}, {414.0, 736.0}}
      Window, 0x60c0001915e0, {{0.0, 0.0}, {414.0, 736.0}}
      Window, 0x60c000191c60, Main Window, {{0.0, 0.5}, {414.0, 736.0}}, identifier: 'Main Window'
    }