我很感兴趣如何找到在我的应用程序的UI测试期间创建的屏幕截图的位置.我想了解Fastlane Snapshot如何抓取此屏幕截图.经过几个小时的研究,我无法找到这些截图的位置.
以下测试在iOS 11上运行正常.它解除了警告,要求使用位置服务的权限,然后放大地图.在iOS 10或9上,它没有做到这一点,测试仍然成功
func testExample() {
let app = XCUIApplication()
var handled = false
var appeared = false
let token = addUIInterruptionMonitor(withDescription: "Location") { (alert) -> Bool in
appeared = true
let allow = alert.buttons["Allow"]
if allow.exists {
allow.tap()
handled = true
return true
}
return false
}
// Interruption won't happen without some kind of action.
app.tap()
removeUIInterruptionMonitor(token)
XCTAssertTrue(appeared && handled)
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么和/或解决方法?
这是一个可以重现问题的项目:https://github.com/TitouanVanBelle/Map
更新
Xcode 9.3 Beta的更新日志显示如下
XCTest UI interruption monitors now work correctly on …Run Code Online (Sandbox Code Playgroud) 我想弄清楚Xcode在Swift中的新UI测试中在分段控件上选择了哪个段.
我可以获得segmentedControl XCUIElement,以及与之关联的"按钮",但我不确定如何测试所选属性.
如果这是我错过的显而易见的事,请提前抱歉.
我正在尝试使用(XCode 7)UI XCTestCase测试用例,我只是偶然发现了一个UIView的问题,其中我有一个带有许多单元格(4000+)的UITableView.
当应用程序正常运行时,仅呈现可见单元格,并且根本没有性能问题.但是,如果我在录制XCTestCase的上下文中运行应用程序并导航到此屏幕,则模拟器会冻结,显然是因为每个单个单元格都被渲染为好像是可见的.如果我尝试手动编写导航脚本并运行XCTestCase,则测试用例在导航到此屏幕后立即失败,退出时出现"UI测试失败 - 无法获得刷新快照",显然是因为所有单元格都在渲染,这样做没有及时完成.
我认为这与测试框架构建显示的屏幕的整个元模型这一事实有关,将4000多个单元格中的每一个添加到视图树层次结构中.
我尝试添加一个期望,希望这会给测试容器足够的时间来完成渲染所有单元格,但这不起作用.
这有解决方法吗?是否有可能跳过构建UI树层次结构的某些部分?我的目标是能够为这个屏幕编写UI测试.
我的UI测试失败,因为测试等待无休止,直到应用程序闲置.我无法看到背景中发生了任何事情,比如加载微调器.
它只出现在一个选项卡上.所有其他选项卡都是可点击的,但测试在屏幕3上失败.在屏幕3上测试后,单击另一个选项卡,测试恢复并成功完成.
有任何想法吗?
- (void)testExample
{
XCUIElementQuery* tabBarsQuery = self.app.tabBars;
[tabBarsQuery.buttons[@"Screen2"] tap];
[tabBarsQuery.buttons[@"Screen3"] tap];
[tabBarsQuery.buttons[@"Screen1"] tap];
[tabBarsQuery.buttons[@"Screen4"] tap];
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用XCode 7的XCTest UI测试功能创建一个树木漫步者,该功能系统地探索表视图的确定性树到指定的深度.它几乎可以工作,除了我无法可靠地检测任何给定元素上的点击是否实际上触发了到新屏幕的转换.我有工作的时间,这是检测无论是导航栏标签已更改或菜单元素的数量变化最大哈克方法.
第一个测试有假阴性,因为连续的屏幕可以有相同的导航栏标签(我走的代码库不是我的).第二个测试具有误报,因为有时单击表元素不会转换到另一个表/屏幕,而是向当前屏幕添加额外的元素.
在做了一些阅读之后,似乎使用可访问性标签可能是最佳选择.所以我设置为(在viewDidAppear)的应用程序代码的导航栏的辅助功能标签UID和然后在UI测试代码测试它.感觉这应该工作,但我只在测试代码中获得nil值.
我会自由地承认,在UI测试方面我是一个菜鸟,主要是切割/粘贴/调整其他人的代码,而不清楚我正在做什么.所以我可能在可访问性标签代码本身中做出某种天真的错误,并且可能在概念层面上检测到屏幕已经改变; 也许我可以做的事情更简单/更惯用.
在申请中:
- (void)viewDidAppear: (BOOL)animated {
[super viewDidAppear: animated];
//...
UINavigationBar* navBar = self.navigationController.navigationBar;
if( navBar )
{
static NSInteger s_UID = 0;
navBar.topItem.accessibilityLabel = [NSString stringWithFormat:@"UID-%ld", s_UID++];
}
}
Run Code Online (Sandbox Code Playgroud)
在XCTest UI测试中:
- (NSString*) navBarAccessibilityLabel: (XCUIApplication*) app
{
NSString* result = NULL;
XCUIElementQuery *navBars = app.navigationBars;
XCUIElement* firstElem = [navBars.staticTexts elementBoundByIndex:0];
if( firstElem )
{
result = (NSString*)firstElem.accessibilityLabel; // This is always nil
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
请注意,firstElem IS被发现,并且我能够非常愉快地从中提取例如firstElem.label.
任何帮助赞赏.
运行XCT UI测试时,可以在后台运行正在测试的应用程序:
XCUIDevice().pressButton(XCUIDeviceButton.Home)
Run Code Online (Sandbox Code Playgroud)
它可以以某种方式将应用程序恢复到前台(活动状态)而无需重新启动应用程序?
我正在测试一个带有Xcode内置UI测试用例的IOS应用程序工作正常,我已启用代码覆盖率报告代码覆盖率报告中的第三方可可豆荚库,我想知道如何从代码覆盖率报告中排除第三方库.
我正在使用Xcode 7的新功能:UI测试.记录交互后,Xcode自动生成代码:
- (void)testDoubleTapToolBarItem {
[[[XCUIApplication alloc] init].tabBars.buttons[@"\U5173\U6ce8"] doubleTap];
~~~~~~~~~~~~~~~~
}
Run Code Online (Sandbox Code Playgroud)
但是,警告也显示出来了.有人知道怎么修这个东西吗?
不完整的通用字符名称
编辑:这似乎是自Xcode 7.0 GM以来的一个BUG
我的一个屏幕有多个文本字段,我可以从不同的其他屏幕登陆到这个屏幕.在每种情况下,我将一个或另一个文本字段作为第一响应者.我无法编写测试来确定所需的textField是否具有焦点.
当我在控制台中打印文本字段时 -
输出:{TextField 0x131171d40:traits:146031247360,Focused,{{ 6.0,108.3 },{402.0,35.0}},value:}
但我在XCUIElement上找不到任何focus/isFocus属性.
有没有办法实现这个目标?
xcode-ui-testing ×10
ios ×8
swift ×3
xcode ×3
xcode7 ×3
objective-c ×2
ui-testing ×2
xctest ×2
xctestcase ×2
fastlane ×1
ios9 ×1
testing ×1
uitableview ×1