Заставить 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.