4

Ich habe eine App mit Today Widget. Also würde ich gerne einige UI-Tests darauf durchführen.XCUITest und Today Widget

Ich habe eine Möglichkeit gefunden, Heute/Benachrichtigungen zu öffnen. Es scheint einfach zu sein:

Aber dann kann ich keinen Weg finden, etwas Nützliches zu tun. Es ist möglich, UI-Interaktionen im Fenster "Heute/Benachrichtigungen" aufzuzeichnen, aber dieser Code kann meine Aktionen nicht reproduzieren.

Antwort

3

Es gibt ein ähnliches Problem beim Testen von Erweiterungen. Ich habe festgestellt, dass Sie das Element an der Stelle auf dem Bildschirm tippen müssen, an der es sich befindet, und nicht das Element selbst, um die Interaktion zu steuern. Ich habe das nicht mit Ihrem Szenario getestet, aber ich habe noch nichts gefunden, das mit dieser Methode nicht mehr zu entfernen ist.

Hier ist ein Swift Beispiel auf dem Sprungbrett für eine App-Icon auf das „X“ -Taste des Klopfens, die in ähnlicher Weise nicht über typische Wechselwirkung abgegriffen werden kann:

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() 

Durch den Rahmen des Super bekommen und die subview können Sie berechnen, wo auf dem Bildschirm das Element sein sollte. Beachten Sie, dass coordinateWithNormalizedOffset einen Vektor im Bereich [0,1] annimmt, keinen Frame- oder Pixel-Offset. Wenn Sie das Element selbst auf eine Koordinate tippen, funktioniert dies auch nicht. Sie müssen also auf den Layer superview/XCUIApplication() tippen.

Weitere verallgemeinerten Beispiel:

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() 

Wenn Sie die Springboard-Schicht zugreifen müssen und außerhalb der Anwendung gehen, können Sie dies mit:

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

Aber Sie werden einige aussetzen müssen private XCUITest-Methoden mit Objective-C:

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

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