我想写一个这样的测试:
当我的应用程序转到某个窗格时,它应该请求使用相机的权限.
我想测试窗格是否出现.我正在使用XC的内置UITest框架来执行此操作.根据我在谷歌和这里发现的,似乎我应该做以下事情:
let dialogAppearedExpectation = expectationWithDescription("Camera Permission Dialog Appears")
addUIInterruptionMonitorWithDescription("Camera Permission Alert") { (alert) -> Bool in
dialogAppearedExpectation.fulfill()
return true
}
goToCameraPage()
waitForExpectationsWithTimeout(10) { (error: NSError?) -> Void in
print("Error: \(error?.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)
测试始于失败,很棒.我实现了goToCameraPage,它正确地导致出现"给予权限"弹出窗口.但是,我希望这会触发中断监视器.然而,没有捕获到这样的中断,并且不会发生履行.
我在某个地方读到app.tap()了对话框出现后你应该做的事情.但是,当我这样做时,它会单击"允许"按钮.对话框消失,仍然没有处理中断.
是否有某种方式将权限对话框视为"警报"或无法处理?我甚至进入并用一个看起来的东西替换了中断位app.alerts,但结果是空的,即使我正在看模拟器中的弹出窗口.
谢谢!我正在为iPhone 6s使用Xcode7.2,iOS 9.2模拟器.
我们最近使用Xcode 8.2.1(8C1002)将Swift 2.3项目更新到Swift 3,现在我们与tableViews和isSelected属性相关的大多数UI测试都不起作用.它总是返回false,即使选择了对象(我们可以在iOS模拟器中看到它).
有没有人遇到类似的问题?我们的代码曾经在转换之前在Swift 2.3中正常工作.以下是我们检索tableView单元格的方法:
let cell = app.tables.cells.element(at: 4)
Run Code Online (Sandbox Code Playgroud)
注意: app是XCUIApplication.
这是我们检查它是否被选中的方式:
XCTAssert(cell.isSelected)
Run Code Online (Sandbox Code Playgroud)
另一个观察是我们确定该对象存在,因为waitForExpectations它返回true:
let existsPredicate = NSPredicate(format: "exists = 1")
expectation(for: existsPredicate, evaluatedWith: cell, handler: nil)
waitForExpectations(timeout: 20, handler: nil)
Run Code Online (Sandbox Code Playgroud)
编辑:为了替换isSelected,我尝试使用NSPredicate selected = 1和isSelected = 1.没有用.我也尝试使用acessibilityValue基于其他问题的答案,但它并不那么简单,因为有时我的表视图中的项目是以编程方式选择/取消选择的.此外,该方法涉及向应用程序添加测试代码,这不是一个好习惯.
在BOUNTY END之后编辑:由于没有人能找到解决该问题的解决方案,这显然是Xcode中的一个错误,我已向Apple提交了错误报告.当他们发布带有修复的Xcode版本时,我会在这里发表评论.
我的应用程序有一个登录屏幕.如果用户按下登录按钮而未在用户名或密码字段中输入任何文本,则应用程序将显示带有错误消息的UIAlert.
我试图在UI测试中模拟这个逻辑,并想断言UIAlert正在显示正确的消息.但是,我找不到一种方法让UI Test访问Alert的message属性.这是测试记录器生成的代码:
func testLoginWithoutPasswort() {
let app = XCUIApplication()
let emailTextField = app.textFields["email"]
emailTextField.tap()
emailTextField.typeText("xxx@gmail.com")
app.buttons["Login"].tap()
app.alerts["Error"].collectionViews.buttons["OK"].tap()
}
Run Code Online (Sandbox Code Playgroud)
反正我是否可以提取UIAlert消息String的值,所以我可以对它进行断言?
我有一系列的UITests我想作为单独的测试运行,但我不想在每次测试之间重新启动应用程序.如何启动应用程序并使其保持打开状态,以便它不会在测试之间关闭和重新启动.
我尝试在init()中放置XCUIApplication().launch()但是出错了.
有没有办法从第一个单元格的UITest中选择或触发didSelect(如果它存在于集合视图中)?
录制时使用所选单元格中的静态文本.如果使用动态内容从网络填充单元格,并且集合视图可能不包含单元格,则此测试将中断.
我正在尝试使用快照自动创建我的应用程序的屏幕截图,一切顺利,直到我想要浏览UIImagePickerController已设置allowsEditing的true.
奇怪的是,在iPhone 4s,5s和6s模拟器这很好,但在iPhone 6(s)Plus测试似乎无法点击"选择"(荷兰语中的"Kies")按钮裁剪视图.
我的第一次尝试在任何版本中都不起作用:
app.buttons.elementBoundByIndex(2).tap()
Run Code Online (Sandbox Code Playgroud)
并导致以下错误:
file:///%3Cunknown%3E:测试失败: - [MyAppSnapshots testExample()]失败:UI测试失败 - 无法滚动到可见(通过AX操作)按钮0x7f82d450ae30:特征:8589934593,{{327.0,613.5}, {35.0,34.0}},标签:'Kies',错误:错误-25204执行AXAction 2003
然后从这个答案中我抓住了解决方案forceTapElement,除了iPhone 6(s)Plus外,它的确可以正常工作.
app.buttons.elementBoundByIndex(2).forceTapElement()
Run Code Online (Sandbox Code Playgroud)
然后我尝试点击坐标;
let window = app.windows.elementBoundByIndex(0)
let rightBottom = window.coordinateWithNormalizedOffset(CGVectorMake(
CGRectGetWidth(window.frame) - 20,
CGRectGetHeight(window.frame) - 20
))
rightBottom.tap()
Run Code Online (Sandbox Code Playgroud)
但这再次无法在任何设备上运行.
那么我该如何测试这些原生接口呢?或者我应该只是添加某种切换到我的代码,以便UIImagePickerController替换为非交互式的东西.
当我尝试运行UI测试时,Xcode 7.3.1给出了这个错误:
案文是:
Setting up profile generation failed
Xcode could not generate profile information for bundle identifier (com.apple.test.XXXXXXXXUITests-Runner). The profile path was missing. The environment variables were valid.
Run Code Online (Sandbox Code Playgroud)
有谁知道可能导致这个或如何解决它?
我试图验证是否可以在XCTest UI测试中获得背景颜色,我希望将背景颜色与设定值进行比较,这样我就不必依赖于图像比较
在 macOS Big Sur 12.3.0、Xcode 12.5.0 上通过 cli/fastlane 运行 ui 测试时
xcodebuild -showBuildSettings -workspace ./MyWorkspace.xcworkspace -scheme MyScheme-UITests
Run Code Online (Sandbox Code Playgroud)
xcodebuild[88311:3500544] DVTErrorPresenter:无法加载模拟器设备。
域:DVTCoreSimulatorAdditionsErrorDomain
代码:3
失败原因:此 Mac 上安装的 CoreSimulator 框架版本已过时,此版本的 Xcode 不支持。
恢复建议:请确保您已安装 Mac 软件的所有可用更新,并且您运行的是 macOS 支持的最新版本的 Xcode。
——
CoreSimulator 已过时。当前版本 (732.18.6) 比构建版本 (757.5.0) 旧。
域:DVTCoreSimulatorAdditionsErrorDomain
代码:3
——
xcodebuild[88311:3500544] iOSSimulator: [SimServiceContext sharedServiceContextForDeveloperDir:error:] 返回 nil (Error Domain=DVTCoreSimulatorAdditionsErrorDomain Code=3“CoreSimulator 已过时。
当前版本 (732.18.6) 比构建版本 (757.5.0) 旧。”
UserInfo={NSLocalizedDescription=CoreSimulator 已过时。当前版本 (732.18.6) 比构建版本 (757.5.0) 旧。})。模拟器设备支持已禁用。
需要更新什么?
它是通过点击“安装组件”修复的,但是我需要弄清楚究竟将安装什么以及是否可以通过 cli 完成
更新:
VNC 进入构建机器(不做任何更改)以某种方式修复了这个......奇怪
语境
我们使用 Mac EC2 实例 CI 集群来运行 UI 测试。集群设置为每晚回收。这意味着新集群是在早上配置的。我们注意到测试在一天中变得越来越不稳定。
日志
片状测试或失败通常是由于“等待某些资源空闲”并达到超时,或某些网络请求完成。失败或不稳定的测试也有一个共同点,即它们通常与视频有关
这是几个示例日志
等待应用空闲
Timed out waiting for app to idle.
The following idling resources are busy.
1. GREYAppStateTracker:
Waiting for network requests to finish. By default, EarlGrey tracks all network requests. To change this behavior, refer to GREYConfiguration.
<__NSCFLocalDataTask:0x7fcfcfd87450, URL:"https://v.myorgimg.com/videos/mc/hls/e7/01/ca/e701caebac12684056eb699f316fc411_360w.m3u8"> => Waiting for network requests to finish. By default, EarlGrey tracks all network requests. To change this behavior, refer to …Run Code Online (Sandbox Code Playgroud)