我希望我的应用程序在UI测试模式下运行时运行特殊代码(例如重置其状态).我查看了从UI测试运行应用程序时设置的环境变量,并且没有任何明显的参数来区分正常运行的应用程序与UI测试中的应用程序.有没有办法找出来?
我不满意的两个解决方法是:
XCUIApplication.launchEnvironment一些变量,我稍后在应用程序中检查.这不好,因为您必须在setUp每个测试文件的方法中设置它.我尝试从方案设置中设置环境变量,但在运行UI测试测试时不会传播到应用程序本身.__XPC_DYLD_LIBRARY_PATH.这似乎非常hacky,可能现在只能工作,因为我们如何设置目标构建设置是巧合.好吧,到目前为止,我还没能在任何测试版中运行此测试.我遇到的一些问题是在这里和这里
现在,我觉得我错过了一些东西.
到目前为止,这是我的进步


然后,我运行了这个测试.
甚至在调用测试之前,整个事情都失败了,在使用以下内容在setup()中启动应用程序之后
***断言失败 - [XCUIApplication init],/ Library/Caches/com.apple.xbs/Sources/XCTest_Sim/XCTest-8170.3/XCTestFramework/UI Testing/XCUIApplication.m:76/Users/UserName/Documents/Projects/Testing/UiTesting/UITestingApp/UITestingApp.swift:0:错误: - [UITestingApp.UITestingApp testSimpleTap]:failed:捕获"NSInternalInconsistencyException","没有通过测试配置指定的目标应用程序路径:
testBundleURL:file:/// Users/UserName /图书馆/开发商/ CoreSimulator /设备/ E3201DC2-CAD3-48C3-95F5-15E18DCA1836 /数据/集装箱/包/应用/ 8B33FC59-FC03-41F8-BD21-43D81BA2D355/UITestingApp-Runner.app /插件/ UITestingApp.xctest /
productModuleName :( null)testsToRun:(null)reportResultsToIDE:no sessionIdentifier:<__ NSConcreteUUID 0x7f93e146c0b0> F242796B-ED26-4AA7-861A-540D2D93CB8F pathToXcodeReportingSocket:(null)disablePerformanceMetrics:no treatMissingBaselinesAsFailures:no baselineFileURL:(null)targetApplicationPath :(null)targetApplicationBundleID:(null)reportActivities:no
任何人遇到这个或对我可能缺少什么有任何建议?
注意:我确实将UI测试目标的"目标应用程序"设置为我的应用程序
更新:我注意到这适用于Xcode的所有beta/final版本 - 相应地更新了标题
因此,通过新的xcode更新,apple改进了我们进行UI测试的方式.在乐器中,我们使用java脚本函数"isVisible"来确定我们的目标元素是否可见.
我试图在目标c中复制这个,但我似乎无法找到相当于此的东西.我有一个表视图,一个原型单元格,上面有两个标签.这个原型单元可以重复使用50次.
我正在尝试滚动,直到最后一个单元格可见,我这样做:
if (![[[[[[XCUIApplication alloc] init].tables childrenMatchingType:XCUIElementTypeCell] matchingIdentifier:@"cell"] elementBoundByIndex:49].staticTexts[@"text"] exists]) {
[[[[[[XCUIApplication alloc] init].tables childrenMatchingType:XCUIElementTypeCell] matchingIdentifier:@"cell"] elementBoundByIndex:0].staticTexts[@"text"] swipeUp];
}
Run Code Online (Sandbox Code Playgroud)
但是这不会滑动,因为加载视图时元素存在.请帮助因为这让我发疯.
在我的应用程序中,我正在使用NSLocalizedString本地化我的应用程序.现在我想切换到UITests和这样的测试代码:
[tabBarsQuery.buttons["particiants"] tap];
Run Code Online (Sandbox Code Playgroud)
这适用于英语,但不适用于其他语言.
[tabBarsQuery.buttons[NSLocalizedString("PARTICIPANTS",comment:nil)] tap];
Run Code Online (Sandbox Code Playgroud)
失败 - 可能是因为Localizable.strings在另一个包中.如何测试本地化应用?
我正在使用Xcode7/iOS 9中引入的XCUIApplication,XCUIElement和XCUIElementQuery为我的应用程序编写UI测试用例.
我遇到了路障.测试用例中的一个屏幕需要iOS的位置服务.正如预期的那样,系统会提示用户允许使用名为" Allow “App name” to access your location while you use the app?with Allow&Don't Allowbuttons"的警报来使用位置服务.
问题是或许似乎由于警报由OS本身呈现,因此它不存在于Application的元素子树中.
我记录了以下内容:
print("XYZ:\(app.alerts.count)")//0
var existence = app.staticTexts["Allow “App Name” to access your location while you use the app?"].exists
print("XYZ:\(existence)")//false
existence = app.buttons["Allow"].exists
print("XYZ:\(existence)") //false
Run Code Online (Sandbox Code Playgroud)
甚至UI录制生成类似的代码:
XCUIApplication().alerts["Allow “App Name” to access your location while you use the app?"].collectionViews.buttons["Allow"].tap()
Run Code Online (Sandbox Code Playgroud)
我还没有找到任何可以让我解决这个问题的API.例如:
那我该怎么办呢?有没有办法配置测试目标,以便不需要位置服务授权.
我遇到了Xcode 7 UI测试的问题.
我的用户登录后,应用程序会显示两个警报,即请求位置警报和推送通知警报.这些通知一个接一个地显示.位置一出现在第一位.
我尝试自动解雇它们以开始我的测试.
为此,我添加了两个UIInterruptionMonitor,第一个用于Location Alert,第二个用于Notification Push Alert.
addUIInterruptionMonitorWithDescription("Location Dialog") { (alert) -> Bool in
/* Dismiss Location Dialog */
if alert.collectionViews.buttons["Allow"].exists {
alert.collectionViews.buttons["Allow"].tap()
return true
}
return false
}
addUIInterruptionMonitorWithDescription("Push Dialog") { (alert) -> Bool in
/* Dismiss Push Dialog */
if alert.collectionViews.buttons["OK"].exists {
alert.collectionViews.buttons["OK"].tap()
return true
}
return false
}
Run Code Online (Sandbox Code Playgroud)
但只触发Location 1,从不调用Push Notifications UIInterruptionMonitor的处理程序.
如果我在返回true 请求位置 UIInterruptionMonitor因为这等后接受的答案指定.两个处理程序都被调用,但两个UIInterruptionMonitor中的alert参数都链接到请求位置警报视图,因此永远找不到"确定"按钮.
如何解除这两个连续的警报视图?
我正在尝试在我的iOS项目中加入UI测试,但是有一件事情继续让我感到震惊的是,你所编写的所有测试似乎都必须从应用程序的开头开始并逐步完成.例如,如果我想测试登录屏幕后面的视图,我的测试必须首先在登录屏幕上运行,输入用户名/密码,单击登录,然后转到我想要测试的视图.理想情况下,登录视图和下一个视图的测试将完全隔离.有没有办法做到这一点,还是我完全错过了UI测试背后的哲学?
问题是当我尝试访问后退栏按钮项时,因为它显示为:
Restaurants 标题, Back 标题 喜欢它在屏幕上:
目前我这样访问它:
let backButton = XCUIApplication().buttons["Restaurants"]
Run Code Online (Sandbox Code Playgroud)
但它不适用于其他情况.这不是普遍的方式.我可以以某种方式设置accessibilityIdentifier或者其他吗?
我正在尝试使用Xcode 7将UI测试添加到现有项目中.但是,UI测试记录按钮始终是灰色的.我在这里缺少什么?
我尝试重新启动Xcode,清理和重建项目并添加新的UI测试目标.有没有其他人经历过同样的行为?
xcode-ui-testing ×10
ios ×8
swift ×5
xcode ×4
xcode7 ×4
xctest ×2
ios9 ×1
iphone ×1
objective-c ×1
xcode7-beta4 ×1