我有一个带有Today Widget的应用程序。所以我想对它进行一些UI测试。
我找到了打开今日/通知面板的方法。这似乎很容易:
let statusBar = XCUIApplication().statusBars.elementBoundByIndex(0)
statusBar.swipeDown()
但是我找不到办法做一些有用的事情。可以在“今日/通知”面板中记录UI交互,但此类代码无法重现我的操作。
答案 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"]