Заставить XCUIElement выполнить 3D-касание для Automate UITest?

Я создаю тестовый сценарий Automate UITest, в котором я хотел бы протестировать сценарий, когда пользователи взаимодействуют с элементом в 3D Touch, а затем показывает их просмотр в виде пика и поп-музыки.

Я не могу найти какие-либо возможные способы симуляции 3D Touch на элемент и продолжить.

У кого-нибудь есть идеи по этому поводу, или 3D Touch все еще недоступен для тестирования?

Спасибо

1 ответ

Мне удалось выполнить принудительное нажатие / 3D Touch на значке приложения на iPhone 7 под управлением iOS 10.3. Это было невозможно на 10.2.

Objective-C

Сначала вы должны объявить следующее или импортировать этот заголовок

typedef void (^CDUnknownBlockType)(void);

@interface XCEventGenerator : NSObject

+ (id)sharedGenerator;

// iOS 10.3 specific
- (double)forcePressAtPoint:(struct CGPoint)arg1 orientation:(long long)arg2 handler:(CDUnknownBlockType)arg3;

@end

А затем выполнить силу пресса

XCUIElement *element = ...; // Get your element
XCUICoordinate *coord = [mapsIcon coordinateWithNormalizedOffset:CGVectorMake(0.5, 0.5)];

[[XCEventGenerator sharedGenerator] forcePressAtPoint:coord.screenPoint orientation:0 handler:^{}]; // handler cannot be nil

Здесь я выполняю принудительное нажатие на значки карт.

Свифт (не тестировался)

Для Swift вы должны объявить / импортировать тот же интерфейс / заголовок, что и выше, а затем выполнить принудительное нажатие, как это

let el = ...; // Get your element
let coord = el.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5) )
let eventGenerator: XCEventGenerator = XCEventGenerator.sharedGenerator() as! XCEventGenerator

eventGenerator.forcePress(at: coord.screenPoint, orientation: 0) { }

В Xcode 10 нет общедоступного API для этого. Однако вы можете использовать-[XCUIElement forcePress]частный API для имитации полноценного взаимодействия Peek and Pop. Вот простое расширение Swift, которое предоставляет эту функциональность.

extension XCUIElement {
    func _forcePress() {
        XCTAssert(exists) // Forces the app to idle before interacting
        perform(Selector(("forcePress")))
    }
}

Имейте в виду, что это частный API, поэтому он может быть изменен / удален в будущих выпусках Xcode. То есть ваши тесты могут начать давать сбой при работе с другой версией Xcode.

Другие вопросы по тегам