让 XCUIElement 为自动化 UITest 执行 3D 触摸?

Posted

技术标签:

【中文标题】让 XCUIElement 为自动化 UITest 执行 3D 触摸?【英文标题】:Make XCUIElement perform 3D touch for Automate UITest? 【发布时间】:2016-09-02 03:58:27 【问题描述】:

我正在创建自动化 UITest 测试用例,我想在其中测试用户与元素进行 3D Touch 交互时的场景,然后向他们显示 Peek 和 Pop 视图。

我似乎找不到任何可能的方法来模拟元素上的 3D Touch 并继续。

任何人对此有任何想法,或者 3D Touch 仍然无法测试?

谢谢

【问题讨论】:

【参考方案1】:

我能够在运行 ios 10.3 的 iPhone 7 上的应用程序图标上执行强制按压/3D Touch。在 10.2 上是不可能的。

Objective-C

首先你必须声明以下内容或导入this header

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(未测试)

对于 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)  

【讨论】:

你能提供一个示例项目吗?我已经按照您上面所说的尝试过,但仍然没有强制触摸。另外,我正在尝试强制触摸跳板上的图标 像魅力一样工作。希望 XCTest.framework 的进一步版本能够公开这些有用的手势。【参考方案2】:

从 Xcode 10 开始,没有公共 API 可以实现这一点。但是,您可以使用 -[XCUIElement forcePress] 私有 API 来模拟完整的 Peek 和 Pop 交互。这是一个公开此功能的简单 Swift 扩展。

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

请记住,这是一个私有 API,因此在 Xcode 的未来版本中可能会发生更改/删除。也就是说,当使用不同的 Xcode 版本运行时,您的测试可能会开始崩溃。

【讨论】:

以上是关于让 XCUIElement 为自动化 UITest 执行 3D 触摸?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XCUIElementQuery 中获取 XCUIElement 的索引?

4. UITest常用方法

Xcode 7 中的 UITest:如何测试键盘布局(keyboardType)

有没有办法在 UITest 中使用 valueForKey 和 NSPredicate?

UITest tap 在使用 iPhone X 的 iOS 12.4 上不起作用(适用于 iPhone 7)

如何查看 XCUIElement 树?