XCUITest和今日小工具

时间:2016-03-30 11:47:26

标签: ios xcode-ui-testing ios8-today-widget today-extension ios9-today-widget

我有一个带有Today Widget的应用程序。所以我想对它进行一些UI测试。

我找到了打开今日/通知面板的方法。这似乎很容易:

let statusBar = XCUIApplication().statusBars.elementBoundByIndex(0)
statusBar.swipeDown()

但是我找不到办法做一些有用的事情。可以在“今日/通知”面板中记录UI交互,但此类代码无法重现我的操作。

2 个答案:

答案 0 :(得分:4)

测试扩展程序存在类似的问题。我发现你必须要做的就是点击元素在屏幕上的位置,而不是元素本身,以便驱动交互。我没有用你的场景对此进行测试,但我还没有通过这种方法找到任何不可用的东西。

这是一个Swift示例,用于点击" X"弹出板上的应用程序图标按钮,同样无法通过典型的交互进行点击:

let iconFrame = icon.frame // App icon on the springboard
let springboardFrame = springboard.frame // The springboard (homescreen)
icon.pressForDuration(1.3) // tap and hold

// Tap the little "X" button at approximately where it is. The X is not exposed directly
springboard.coordinateWithNormalizedOffset(CGVectorMake((iconFrame.minX + 3) / springboardFrame.maxX, (iconFrame.minY + 3) / springboardFrame.maxY)).tap()

通过获取超视图和子视图的帧,您可以计算元素应在屏幕上的位置。请注意,coordinateWithNormalizedOffset采用[0,1]范围内的向量,而不是帧或像素偏移。在一个坐标上点击元素本身也不起作用,因此你必须点击superview / XCUIApplication()层。

更通用的例子:

let myElementFrame = myElement.frame
let appFrame = XCUIApplication().frame
let middleOfElementVector = CGVectorMake(iconFrame.midX / appFrame.maxX, iconFrame.midY / appFrame.maxY)

// Tap element from the app-level at the given coordinate
XCUIApplication().coordinateWithNormalizedOffset(middleOfElementVector).tap()

如果您需要访问Springboard图层并转到应用程序之外,您可以使用:

let springboard = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.springboard")
springboard.resolve()

但是您需要使用Objective-C公开一些私有的XCUITest方法:

@interface XCUIApplication (Private) {
    - (id)initPrivateWithPath:(id)arg1 bundleID:(id)arg2;
}

@interface XCUIElement (Private) {
    - (void) resolve;
}

答案 1 :(得分:4)

首先你需要打开Today View,你可以这样使用:

    let app = XCUIApplication()
    // Open Notification Center
    let bottomPoint = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 2))
    app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0)).press(forDuration: 0.1, thenDragTo: bottomPoint)
    // Open Today View
    let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    springboard.scrollViews.firstMatch.swipeRight()

然后,要访问您需要的所有内容,只需使用springboard,例如:

let editButton = springboard.buttons["Edit"]