应用程序图标在 iOS 13 设备上不在屏幕上,无法通过 XCUITest 按下

Posted

技术标签:

【中文标题】应用程序图标在 iOS 13 设备上不在屏幕上,无法通过 XCUITest 按下【英文标题】:App icon is offscreen on iOS 13 devices and it cannot be pressed via XCUITest 【发布时间】:2019-11-05 12:39:34 【问题描述】:

我正在使用以下方法从 Springboard 中删除我的应用程序,但似乎偶尔它的框架似乎不在屏幕上,因此 isHittable 变为 false。

let springApp = XCUIApplication(bundleIdentifier: "com.apple.springboard")    
let icon = springApp.otherElements.icons["App Name"]
        if icon.exists 
            let iconFrame = icon.frame
            icon.press(forDuration: 3)

            springApp.tapAtPoint(iconFrame.origin)

            sleep(0.5)
            springApp.alerts.buttons["Delete"].tap()

以下是问题发生时提供的位置:

 ▿ (-2.0, -2.0, 4.0, 4.0)
  ▿ origin : (-2.0, -2.0)
    - x : -2.0
    - y : -2.0
  ▿ size : (4.0, 4.0)
    - width : 4.0
    - height : 4.0

知道为什么会发生这种情况,如果我能以某种方式解决它吗?不过,它似乎无法在 ios 12 设备上重现。

【问题讨论】:

我有同样的问题,我还没有找到任何解决方案...我之前尝试终止应用程序但结果相同... 我也有同样的问题。有人找到解决此问题的方法了吗? 最后一次 Xcode 更新是否仍然失败?另外,在您的测试执行期间,您是否切换到其他应用程序?我试图找到重现失败的方法。 升级到 iOS 13.2 后不再重现故障。 【参考方案1】:

如果重置主屏幕布局,Springboard 似乎会返回正确的坐标: 设置 -> 常规 -> 重置 -> 重置主屏幕布局。

您可以在下面找到适合我的解决方案而不会出现问题:

func resetHomeScreenLayout(file: String = #file, line: Int = #line) 
    settingsApp.launch()

    let settingsGeneralCell = settingsApp.cells["General"]
    XCTAssertTrue(settingsGeneralCell.waitForExistence(timeout: Constants.smallWaitTime),
                  "The \"General\" cell in Settings was not found. Error in file \(file) at line \(line).")
    settingsGeneralCell.tap()

    let settingsResetCell = settingsApp.cells["Reset"]
    XCTAssertTrue(settingsResetCell.waitForExistence(timeout: Constants.smallWaitTime),
                  "The \"Reset\" cell in Settings was not found. Error in file \(file) at line \(line).")
    settingsResetCell.tap()

    let settingsResetHomeScreenLayoutLink = settingsApp.staticTexts["Reset Home Screen Layout"]
    XCTAssertTrue(settingsResetHomeScreenLayoutLink.waitForExistence(timeout: Constants.smallWaitTime),
                  "The \"Settings\" link \"Reset Home Screen Layout\" was not found. Error in file \(file) at line \(line).")
    settingsResetHomeScreenLayoutLink.tap()

    let settingsResetHomeScreenPopOverButton = settingsApp.sheets.buttons["Reset Home Screen"]
    XCTAssertTrue(settingsResetHomeScreenPopOverButton.waitForExistence(timeout: Constants.smallWaitTime),
                  "The \"Settings\" popover \"Reset Home Screen\" button was not found. Error in file \(file) at line \(line).")
    settingsResetHomeScreenPopOverButton.tap()

    settingsApp.terminate()

在长按应用图标之前调用此方法,它应该是可点击的。 确保根据需要向左滑动跳板,以使应用图标可见。 这至少在 iOS 13.1.3 上对我有用。

【讨论】:

模拟器没有这个功能【参考方案2】:

这适用于所有操作系统版本(iOS11、12 和 13)

static let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")

    func deleteApp() 
        XCUIApplication().terminate()
        springboard.activate()

        let icon = springboard.icons[appName]

        if icon.exists 
            icon.firstMatch.press(forDuration: 5)
            icon.buttons["DeleteButton"].tap()
            XCUIDevice.springboard.coordinate(withNormalizedOffset: CGVector(dx: (iconFrame.minX + 3) / springboardFrame.maxX, dy: (iconFrame.minY + 3) / springboardFrame.maxY)).tap()
            let deleteConfirmation = springboard.alerts["Delete “\(appName)”?"].buttons["Delete"]
            XCTAssertTrue(deleteConfirmation.waitForExistence(timeout: 5), "Delete confirmation not shown")
            deleteConfirmation.tap()
        
    

【讨论】:

以上是关于应用程序图标在 iOS 13 设备上不在屏幕上,无法通过 XCUITest 按下的主要内容,如果未能解决你的问题,请参考以下文章

iOS App图标未出现在屏幕上

具有透明背景的 iOS 应用程序图标在设备上显示黑色背景

Fontawesome 图标显示在桌面上但不在移动设备上

ios主屏幕重新命名

ios16桌面图标转盘效果

应用程序可以在模拟器上完美运行,但不能在物理设备上[在iOS 13.3.1上]