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

但是,由于无法在“今日视图”中单击“编辑”按钮,因此我很努力。如果未安装任何小部件,则可以轻松单击该按钮。但是,在模拟器重置后,将出现小部件(“地图”,“提醒”,“快捷方式”等),并且该按钮不再可单击。更糟糕的是'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并将以下小部件添加到“今日视图”:
  • 提醒
  • 日历
  • 地图目的地
  • 快捷方式
  • 新闻

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

    如果有人可以帮助我找到一个很好的解决方案。我已经尝试了所有可以想出的方法,但是没有用……

    最佳答案

    有时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()
        }
    }
    

    10-01 19:46