如何判断我在Xcode UI测试中使用的设备?

时间:2015-08-30 16:16:42

标签: ios testing xcode7 xcode-ui-testing

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

如何获取此信息?

6 个答案:

答案 0 :(得分:18)

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

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

使用旧版本的Swift:

UIDevice.currentDevice().userInterfaceIdiom

答案 1 :(得分:8)

不幸的是,没有直接查询当前设备的方法。但是,您可以通过查询设备的大小类来解决此问题:

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设备(目前)同时具有垂直和水平尺寸类别"常规"。

答案 2 :(得分:2)

对于目标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
}

答案 3 :(得分:1)

您可以使用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

答案 4 :(得分:0)

  • 迅速:5.2.4
  • Xcode:11.6
var isiPad: Bool {
   return UIDevice.current.userInterfaceIdiom == .pad
}

答案 5 :(得分:0)

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

如果您只想获得 trait 集合的水平/垂直尺寸类,您可以通过访问 myXCUIElement.horizontalSizeClass.verticalSizeClass 来更加向后兼容您的测试(Xcode 10.0+)测试,因为它们通过所有 UI 元素采用的 XCUIElementAttributes 协议公开。 (但请注意,我在调用 .unspecified 时得到了 XCUIApplication();最好在窗口中使用真正的 UI 元素。如果你手头没有一个,你仍然可以使用类似的东西app!.windows.element(boundBy: 0).horizontalSizeClass == .regular 如前所述。)