Могу ли я проверить, существует ли представление на экране с KIF?
Я делаю шаг "до каждого", и я хочу сделать шаги для выхода из системы. Я не могу найти ничего о проверке, существует ли элемент, прежде чем я попытаюсь коснуться его, а затем, если он не существует, сделайте что-нибудь еще. Возможно ли это сделать с KIF без ссылки на объект, который я хочу проверить?
Что-то вроде:
if([tester elementExistsWithAccesibilityLabel:@"backButton"])
{
[tester tapViewWithAccessibilityLabel:@"backButton"];
}
else
{
[tester tapViewwithAccesibilityLabel:@"Logout"];
}
Ответы
Ответ 1
Я бы предложил попробовать этот подход:
if([[[UIApplication sharedApplication] keyWindow] accessibilityElementWithLabel:@"backButton"] != nil) {
[tester tapViewWithAccessibilityLabel:@"backButton"];
} else {
[tester tapViewWithAccessibilityLabel:@"Logout"];
}
Ответ 2
Эти методы делают трюк. Добавьте их в категорию для 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;
}
Это работает для меня очень хорошо.
Ответ 3
Если кто-то все еще ищет ответ, в 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;
Ответ 4
Вы можете попробовать что-то вроде этого:
@try {
if([tester waitForViewWithAccessibilityLabel:@"backButton"])
{
[tester tapViewWithAccessibilityLabel:@"backButton"];
}
@catch (NSException *exception )
{
[tester tapViewwithAccesibilityLabel:@"Logout"];
}
@finally
{
NSLOG(@"User logged out.");
}
Ответ 5
Для быстрого 3:
/** return true when the view is found */
func searchForElement(_ label:String) -> Bool{
do {
try tester().tryFindingView(withAccessibilityLabel: label)
return true
} catch {
return false
}
}
Ответ 6
Я сделал эту функцию, которая, кажется, делает трюк в крайнем случае, но у него возникнут некоторые проблемы, если бы несколько тестов интеграции одновременно полагались на глобальный таймаут по умолчанию. Пока что, похоже, работает для меня.
static CGFloat CPKIFDefaultTimeout = 2
- (BOOL)elementExistsWithAccessibilityLabel:(NSString *)accessibilityLabel {
[KIFTestActor setDefaultTimeout:0.0];
BOOL result = [tester waitForViewWithAccessibilityLabel:accessibilityLabel] ? YES : NO;
[KIFTestActor CPKIFDefaultTimeout];
return result;
}
Ответ 7
Хорошо, никто из них не работал у меня... Однако у меня есть решение
Оформить заказ этот смысл.
Что я сделал, так это взятый KIF-код и просто удалил проверку ошибок - работает для меня как прелесть.
Это не подведет ваши тесты, когда он не сможет найти элемент!