我可以使用KIF检查屏幕上是否存在视图吗?

我正在做一个“每个”之前的步骤,我想要做的步骤来注销。 在我尝试触摸它之前,我找不到任何有关元素的存在,如果不存在,请执行其他操作。 是否有可能做到这一点与KIF没有参考我想检查的对象?

就像是:

if([tester elementExistsWithAccesibilityLabel:@"backButton"]) { [tester tapViewWithAccessibilityLabel:@"backButton"]; } else { [tester tapViewwithAccesibilityLabel:@"Logout"]; } 

我会build议尝试这种方法:

 if([[[UIApplication sharedApplication] keyWindow] accessibilityElementWithLabel:@"backButton"] != nil) { [tester tapViewWithAccessibilityLabel:@"backButton"]; } else { [tester tapViewWithAccessibilityLabel:@"Logout"]; } 

这些方法有诀窍。 将它们添加到KIFUITestActor的类别。

 #import "UIApplication-KIFAdditions.h" #import "UIAccessibilityElement-KIFAdditions.h" #import "NSError-KIFAdditions.h" - (BOOL)existsViewWithAccessibilityLabel:(NSString *)label { UIView *view = nil; UIAccessibilityElement *element = nil; return [self existsAccessibilityElement:&element view:&view withLabel:label value:nil traits:UIAccessibilityTraitNone tappable:YES]; } - (BOOL)existsAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits tappable:(BOOL)mustBeTappable { KIFTestStepResult (^executionBlock)(NSError **) = ^(NSError **error) { return [UIAccessibilityElement accessibilityElement:element view:view withLabel:label value:value traits:traits tappable:mustBeTappable error:error] ? KIFTestStepResultSuccess : KIFTestStepResultWait; }; NSDate *startDate = [NSDate date]; KIFTestStepResult result; NSError *error = nil; NSTimeInterval timeout = 10.0; while ((result = executionBlock(&error)) == KIFTestStepResultWait && -[startDate timeIntervalSinceNow] < timeout) { CFRunLoopRunInMode([[UIApplication sharedApplication] currentRunLoopMode] ?: kCFRunLoopDefaultMode, 0.1, false); } if (result == KIFTestStepResultWait) { error = [NSError KIFErrorWithUnderlyingError:error format:@"The step timed out after %.2f seconds: %@", timeout, error.localizedDescription]; result = KIFTestStepResultFailure; } return (result == KIFTestStepResultSuccess) ? YES : NO; } 

它对我很好。

如果有人仍然在寻找答案,KIF中有一系列的方法只是做了KIFUITestActor-ConditionalTests.h

 - (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label error:(out NSError **)error; - (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits error:(out NSError **)error; - (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits error:(out NSError **)error; - (BOOL)tryFindingTappableViewWithAccessibilityLabel:(NSString *)label error:(out NSError **)error; - (BOOL)tryFindingTappableViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits error:(out NSError **)error; - (BOOL)tryFindingTappableViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits error:(out NSError **)error; - (BOOL)tryFindingAccessibilityElement:(out UIAccessibilityElement **)element view:(out UIView **)view withIdentifier:(NSString *)identifier tappable:(BOOL)mustBeTappable error:(out NSError **)error; - (BOOL)tryFindingAccessibilityElement:(out UIAccessibilityElement **)element view:(out UIView **)view withElementMatchingPredicate:(NSPredicate *)predicate tappable:(BOOL)mustBeTappable error:(out NSError **)error; 

如果你正在使用辅助标识符( pod 'KIF/IdentifierTests' ),那么也有非常方便的等价方法: - (BOOL) tryFindingViewWithAccessibilityIdentifier:(NSString *) accessibilityIdentifier;

你可以尝试这样的事情:

 @try { if([tester waitForViewWithAccessibilityLabel:@"backButton"]) { [tester tapViewWithAccessibilityLabel:@"backButton"]; } @catch (NSException *exception ) { [tester tapViewwithAccesibilityLabel:@"Logout"]; } @finally { NSLOG(@"User logged out."); } 

对于迅捷3:

 /** return true when the view is found */ func searchForElement(_ label:String) -> Bool{ do { try tester().tryFindingView(withAccessibilityLabel: label) return true } catch { return false } } 

我做了这个函数似乎在捏,但如果多个集成testing同时依赖于全局默认超时,它会有一些问题。 到目前为止,似乎为我工作。

 static CGFloat CPKIFDefaultTimeout = 2 - (BOOL)elementExistsWithAccessibilityLabel:(NSString *)accessibilityLabel { [KIFTestActor setDefaultTimeout:0.0]; BOOL result = [tester waitForViewWithAccessibilityLabel:accessibilityLabel] ? YES : NO; [KIFTestActor CPKIFDefaultTimeout]; return result; } 

好吧,这些都没有为我工作…但是我有一个解决scheme

结帐这个要点。

我所做的是采取KIF的代码,只是删除了错误检查 – 像我的魅力。

当它不能find一个元素时,这不会使你的testing失败!