执行 XCUITest 时,Tap 方法在今日视图中不起作用

Posted

技术标签:

【中文标题】执行 XCUITest 时,Tap 方法在今日视图中不起作用【英文标题】:Tap method not working in Today View when performing XCUITest 【发布时间】:2020-06-15 15:12:33 【问题描述】:

我有一个带有小部件的应用,我需要自动创建它的屏幕截图。

但是,由于无法单击“今日视图”中的“编辑”按钮,我很难做到这一点。如果没有安装小部件,则该按钮很容易点击。但是,在模拟器重置后,存在小部件(地图、提醒、快捷方式等),并且该按钮不再可点击。更糟糕的是 'isHittable' 返回 true :(

我要运行的代码是:

let app = XCUIApplication()
app.launch()
app.activate()

// Open Notification Center by swiping down
let bottomPoint = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 2))
app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0)).press(forDuration: 0.1, thenDragTo: bottomPoint)
sleep(1)

// now swipe to reveal Today View (uses custom method)
let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
springboard.scrollViews.firstMatch.swipeRight()
sleep(1)

// To make sure Edit button is visible, swipeUP
springboard.scrollViews.firstMatch.swipeUp()
sleep(2)

// Now tap the edit button (DOESN"T WORK)
springboard.buttons["Edit"].press(forDuration: 1)
sleep(2)

我创建了一个简单的项目来说明位于here 的错误。

要亲自查看错误,请打开 iPhone 11 Pro Max 并将以下小部件添加到“今日视图”:

    提醒 日历 地图目的地 快捷方式 新闻

然后,尝试从XCUITestCrashUITests 运行testExample 测试。如果成功,最后应该单击“编辑”按钮,您应该会看到“编辑”屏幕。但是,它永远不会被点击:(

如果有人可以帮助我找到一个很棒的解决方案。我已经尝试了所有我能想到的方法,但它不起作用......

【问题讨论】:

幸好你把代码弄好了。我已经重现了这个错误。 【参考方案1】:

有时tap() 会失败或什么都不做。一个常见的解决方案是点击元素的坐标而不是元素本身。

extension XCUIElement 
    func tapUnhittable() 
        XCTContext.runActivity(named: "Tap \(self) by coordinate")  _ in
            coordinate(withNormalizedOffset: CGVector(dx: 0.0, dy: 0.0)).tap()
        
    

这是有效的代码

import XCTest

class XCUITestCrashUITests: XCTestCase 
    func testExample() throws 
        let app = XCUIApplication()
        app.launch()
        let bottomPoint = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 2))
        app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0)).press(forDuration: 0.1, thenDragTo: bottomPoint)

        let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
        springboard.swipeRight()
        springboard.swipeUp()
        springboard.buttons["Edit"].tapUnhittable()
    

【讨论】:

以上是关于执行 XCUITest 时,Tap 方法在今日视图中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

XCUITest 和今日小部件

如何打印 XCUITest 中的所有静态文本

XCUITest 和动态生成的视图

Swift:为自定义视图添加 Tap

我们可以在 xcuitest 中使用 Notification Center 来监听内部事件吗?

Swift XCUITest:如何在执行 UI 测试时单击 UIImagePickerController() 的默认“选择”按钮?