我正在写一个UIAutomation测试用例,我需要等待用户激活才能继续.似乎没有一种很好的方法可以检查按钮是否可以更改为启用状态.
什么是最好的是在检查它的状态之前等待UI中发生的事情?
dispatch_after和NSTimer似乎都不起作用.他们只是阻止失败.
我正在测试Xcode 7的新UI测试功能(在WWDC 2015视频" Xcode中的UI测试 "中介绍).
启动时,我的应用程序通过更新其垂直布局约束的值将"登录面板"设置为视图:面板从主视图下方(屏幕外)向上滑动到视图中.
该面板包含两个文本字段,分别用于用户名和密码.
当您在键盘上点击用户名文本字段的返回键(标记为"下一步")时,密码文本字段将成为第一响应者.当您点击密码文本字段的回溯键(标记为"开始")时,面板被"关闭"(即,屏幕后回动画),活动指示器开始旋转并开始认证.
我记录了一个执行上述操作的测试,但是当我尝试"重现"它时,它似乎失败了,因为文本字段不能立即输入:
测试套件'精选测试'开始于2015-08-14 13:14:19.454测试套件'MyAppUITests'开始于2015-08-14 13:14:19.454测试用例' - [MyAppUITests.MyAppUITests testExample]'开始.
t = 0.00s开始测试
t = 0.00s设置
t = 0.00s启动com.myCompany.MyApp 2015-08-14 13:14:19.953 XCTRunner [4667:451922]继续在后台运行测试,任务ID为1
t = 2.64s等待加载的可访问性
t = 6.20s等待应用程序空闲
t = 6.49s点击"用户ID"TextField
t = 6.49s等待应用程序空闲
t = 6.57s找到"用户ID"TextField
t = 6.57s com.myCompany.MyApp的快照可访问性层次结构
t = 6.60s查找:匹配类型的后代TextField
t = 6.60s查找:匹配谓词的元素'"用户ID"IN标识符'
t = 6.60s等待应用程序空闲
t = 6.67s合成事件
t = 6.74s滚动元素到可见
t = 6.78s断言失败:UI测试失败 - 无法滚动到可见(通过AX操作)TextField 0x7fc90251a130:traits:146029150208,{{107.0,807.0},{200.0 ,30.0}},placeholderValue:'用户ID',值:fffffaaaa,错误:错误-25204执行AXAction 2003:0:错误: - [MyAppUITests.MyAppUITests …
我无法在我正在测试的应用程序的屏幕上找到XCUIElements.我意识到你可以通过以下方式访问按钮:
app.buttons[].elementBoundByIndex(0)
Run Code Online (Sandbox Code Playgroud)
但问题是有时候,找不到组件.就像我在UITableView中的单元格中有一个Button的情况一样.我尝试使用XCUIElementQuery来查找按钮,但它不在那里.我尝试查找表或tableviews或集合视图,即使它们在视图控制器中,它们也不会在UI测试中找到.返回数组的计数将为零.
我最初尝试记录测试,但单击我尝试访问的元素不起作用.Xcode将其检测为"其他元素",并且在尝试点击期间,播放应用程序不会前进.
是否有一种高级方法来访问UI层次结构中的UIView高级组件以进行级联?
我的导航栏上有一个"添加"按钮,我需要让Xcode的UI测试点击该按钮,在它打开的视图控制器中执行测试.我以编程方式添加按钮,如下所示:
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(showAddVC)];
self.navigationItem.rightBarButtonItem = addButton;
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我有:
XCUIApplication *app = [[XCUIApplication alloc] init];
XCTAssert([app.buttons[@"Add"] exists]); // <-- This passes, so the test runner does see the button.
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用以下两种方式来点击它时:
// Generated using the test recorder
[app.navigationBars[@"App Title"].buttons[@"Add"] tap];
Run Code Online (Sandbox Code Playgroud)
要么:
// Same expression used with the XCTAsset earlier
[app.buttons[@"Add"] tap];
Run Code Online (Sandbox Code Playgroud)
什么都没发生.点击按钮时应该执行的操作不会发生.我尝试在行sleep(5)之间添加一些内容以让应用程序加载,但这没有多大帮助.
这是测试日志:
Test Case '-[xx]' started.
t = 0.00s Start Test
t = 0.00s Set Up
2015-12-22 16:25:02.898 XCTRunner[10978:384690] Continuing to run tests in …Run Code Online (Sandbox Code Playgroud) 我试图找到一种方法来点击具有以下HTML结构的链接:
<a>
<div id="facebook_sharing"></div>
</a>
Run Code Online (Sandbox Code Playgroud)
该a标签没有与之相关联的,只是任何属性或文本div标签内.
我尝试了以下但没有成功:
app.links["facebook_sharing"].tap()
Run Code Online (Sandbox Code Playgroud)
有没有办法找到div标签元素并点击它?
谢谢!
我有问题,如果我尝试允许系列系统警报,只工作一次,下一个警报不"允许"我谷歌搜索更多时间,并知道该帖子:(Xcode 7 UI测试:如何解雇一系列系统警报代码)没什么..不行.这是我当前的代码,首先警告"允许"成功,未检测到下一个警报..
XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchEnvironment = @{
@"isUITest" : @YES,
@"withFakeData" : fakeData
};
[app launch];
for (int i = 1; i <= self.possibleSystemAlerts; i++) {
NSLog(@"%d", i);
XCTestExpectation *expectation = [self expectationWithDescription:@"High Expectations"];
id monitor = [self addUIInterruptionMonitorWithDescription:@"Push notifications" handler:^BOOL(XCUIElement *_Nonnull interruptingElement) {
XCUIElement *element = interruptingElement;
XCUIElement *allow = element.buttons[@"Allow"];
XCUIElement *ok = element.buttons[@"OK"];
if ([ok exists]) {
[ok tap];
[expectation fulfill];
return YES;
}
if ([allow exists]) {
[allow forceTap]; …Run Code Online (Sandbox Code Playgroud) 所以我在XCode中开始一个UI测试,在此期间发生错误或抛出一些异常.
我开始调试并尝试了解问题所在,但是在一段时间后,UI测试失败并显示以下错误消息:
Assertion Failure: UI Testing Failure - Failed to perform AX action for monitoring the animations of <XCUIApplicationProcess...
堆栈已经消失,打印到控制台的所有内容也都消失了.所以在发生这种情况后我无法继续调试.
我假设XCode认为它正在等待动画?还有别人这个问题吗?你知道如何解决它吗?或者是否有可能将计时器增加到几秒钟以上?
我希望能够验证UI测试中导航栏中是否出现子字符串.
例如,如果导航栏标题是"Rent Properties",那么我可以这样匹配:
XCTAssert(XCUIApplication().staticTexts["Rent Properties"].exists)
Run Code Online (Sandbox Code Playgroud)
但是,这有两个问题:
如何才能做到这一点?
我正在尝试使用XCode进行iOS UI测试.我的测试应用程序具有带可访问性标识的UITextView元素displayTextView.
我尝试了简单的测试,点击这个元素,键入一些文本,然后检查结果如下:
XCUIElement *textView = app.textViews[@"displayTextView"];
[textView tap];
[textView typeText:@"9.9"];
Run Code Online (Sandbox Code Playgroud)
有用.但后来我无法从文本视图中获取键入的文本.我尝试通过以下方式做到这一点:
XCTAssertEqual([textView.accessibilityValue isEqualToString:@"9.9"]);
Run Code Online (Sandbox Code Playgroud)
但它似乎不正确,因为textView.accessibilityValue为null.获取打字文本的方法是什么?
我正在为我的iOS应用程序实现UITests.到目前为止,我已经能够进行一些简单的测试,但是我来到一个tableView,其中有两个部分.每个部分都有一个包含静态文本的sectionHeaderView,例如."第1节"和"第2节",正常部分为头部样式.
执行app.tables.staticTexts["SECTION 1"].exists时返回true.这是第一部分,在视图加载时最顶部可见.
执行相同操作时,但对于"第2节",它将返回false.此部分的sectionHeaderView此时在视图之外,所以我认为这是问题所在,但事实证明它不是..我试过app.swipeUp(),它成功地将第二部分带入了屏幕.在swipeUp之后我睡了几秒钟让视图稳定下来,并且我执行相同的检查,但它根本无法找到第二个sectionView.
向下滚动后,我试图打印出来app.tables.staticTexts.debugDescription,看看它可以找到,而且它仅说明了第一部分,以及一个tableFooterView我在的tableView的最底部.
在我执行的时候,我app.tables.staticTexts["SECTION 2"].exists可以在模拟器上逐字地看到"第2节"文本.但它并不存在于测试中.
为什么我的第二部分HeaderView对XCTest完全不可见?可能是因为我特别在这个视图上禁用了某种辅助功能 - 变量吗?我找不到任何东西..
编辑,输出:
t = 32.25s Find: Descendants matching type Table
t = 32.26s Find: Descendants matching type StaticText
t = 32.26s Find: Elements matching predicate '"SECTION 1" IN identifiers'
Found SECTION 1. Will scroll down to find Section 2.
t = 32.26s Swipe up Target Application 0x6080000bbf60
t = 32.26s Wait for app to idle
t = …Run Code Online (Sandbox Code Playgroud) ios ×10
xcode-ui-testing ×10
xcode ×5
objective-c ×3
ui-testing ×3
xcode7 ×2
xctest ×2
ios9 ×1
swift ×1
uitest ×1