应用程序图标在 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 按下的主要内容,如果未能解决你的问题,请参考以下文章