22

在运行 Xcode UI 测试时,我想知道正在使用哪个设备/环境(例如 iPad Air 2、iOS 9.0、模拟器)。

我怎样才能得到这些信息?

4

6 回答 6

26

使用 Swift 3(根据需要将 .pad 更改为 .phone):

if UIDevice.current.userInterfaceIdiom == .pad {
    // Ipad specific checks
}

使用旧版本的 Swift:

UIDevice.currentDevice().userInterfaceIdiom
于 2015-10-26T22:18:03.820 回答
11

不幸的是,没有直接查询当前设备的方法。但是,您可以通过查询设备的尺寸等级来解决:

private func isIpad(app: XCUIApplication) -> Bool {
    return app.windows.elementBoundByIndex(0).horizontalSizeClass == .Regular && app.windows.elementBoundByIndex(0).verticalSizeClass == .Regular
}

正如您在Apple Description of size classes中看到的那样,只有 iPad 设备(当前)同时具有垂直和水平尺寸类别“Regular”。

于 2016-06-08T08:03:16.187 回答
5

您可以使用windows元素框架XCUIApplication().windows.element(boundBy: 0).frame进行检查并检查设备类型。

XCUIDevice您还可以使用属性设置扩展名currentDevice

/// Device types
public enum Devices: CGFloat {

    /// iPhone
    case iPhone4 = 480
    case iPhone5 = 568
    case iPhone7 = 667
    case iPhone7Plus = 736

    /// iPad - Portraite
    case iPad = 1024
    case iPadPro = 1366

    /// iPad - Landscape
    case iPad_Landscape = 768
    case iPadPro_Landscape = 0
}

/// Check current device
extension XCUIDevice {
    public static var currentDevice:Devices {
        get {
            let orientation = XCUIDevice.shared().orientation

            let frame = XCUIApplication().windows.element(boundBy: 0).frame

            switch orientation {
            case .landscapeLeft, .landscapeRight:
                return frame.width == 1024 ? .iPadPro_Landscape : Devices(rawValue: frame.width)!
            default:
                return Devices(rawValue: frame.height)!
            }
        }
    }
}

用法

let currentDevice = XCUIDevice.currentDevice

于 2017-05-12T06:54:21.277 回答
2

也许有人会在 Objective C 上的 XCTest 中派上用场:

// Check if the device is iPhone
if ( ([[app windows] elementBoundByIndex:0].horizontalSizeClass != XCUIUserInterfaceSizeClassRegular) || ([[app windows] elementBoundByIndex:0].verticalSizeClass != XCUIUserInterfaceSizeClassRegular) ) {
    // do something for iPhone
}
else {
    // do something for iPad
}
于 2016-12-14T15:50:51.900 回答
0
  • 斯威夫特:5.2.4
  • 代码:11.6
var isiPad: Bool {
   return UIDevice.current.userInterfaceIdiom == .pad
}

于 2020-08-01T21:09:07.497 回答
0

使用 iOS13+,您现在可以使用UITraitCollection.current来获取当前环境的完整特征集。(文档

如果您只想获取 trait 集合的水平/垂直大小类,您可以通过访问myXCUIElement.horizontalSizeClass.verticalSizeClass在测试中更向后兼容您的测试(Xcode 10.0+),因为它们通过所有 UI的XCUIElementAttributes协议公开元素采用。(请注意,虽然我在.unspecified取消时遇到了XCUIApplication();最好在窗口中使用真正的 UI 元素。如果您手头没有,您仍然可以始终使用像app!.windows.element(boundBy: 0).horizontalSizeClass == .regular过去提到的那样的东西。)

于 2021-06-09T10:49:14.927 回答