Ошибка EarlGrey - клавиатура не исчезала после отказа от статуса первого ответчика

Я пытаюсь написать тесты пользовательского интерфейса для моей страницы входа. На странице есть несколько вступительных анимаций, поле поиска (для поиска нужного сервера для подключения), а затем, когда они выбирают правильный сервер, появляется поле имени пользователя и пароля.

Вот мой тест на данный момент:

[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"searchTextField")]
 assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"searchTextField")] performAction:grey_typeText(@"gtX9Vn23k1")];
[[EarlGrey selectElementWithMatcher:grey_anyOf([self matcherForUITableViewCell], nil)] performAction:grey_tap()];

[[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"usernameTextField")]
 assertWithMatcher:grey_interactable()] performAction:grey_tap()];
[[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"usernameTextField")]
  assertWithMatcher:grey_interactable()] performAction:[GREYActions actionForTypeText:@"Why isnt this working?"]];

Этот тест не проходит.

EarlGrey правильно выбирает и печатает в первое текстовое поле (searchTextField).

EarlGrey правильно выбирает ячейку tableview!

Затем EarlGrey правильно выбирает имя пользователя TextField, но затем не удается набрать текст, что приводит к следующей ошибке после тайм-аута:

Exception: ActionFailedException
Reason: Action 'Type "Why isnt this working"' failed.
Element matcher: (respondsToSelector(accessibilityIdentifier) &&   accessibilityID("usernameTextField"))
Complete Error: Error Domain=com.google.earlgrey.ElementInteractionErrorDomain   Code=1 "Keyboard did not disappear after resigning first responder status of   <GHDLoginTextField: 0x7fa96a616bd0; baseClass = UITextField; frame = (150 387; 468    29); text = ''; opaque = NO; autoresize = RM+BM; tintColor = UIDeviceWhiteColorSpace 1 1; gestureRecognizers = <NSArray: 0x7fa96a55d5d0>; layer = <CALayer: 0x7fa96a616a80>>" UserInfo={NSLocalizedDescription=Keyboard did not disappear after resigning first responder status of <GHDLoginTextField: 0x7fa96a616bd0; baseClass = UITextField; frame = (150 387; 468 29); text = ''; opaque = NO; autoresize = RM+BM; tintColor = UIDeviceWhiteColorSpace 1 1; gestureRecognizers = <NSArray: 0x7fa96a55d5d0>; layer = <CALayer: 0x7fa96a616a80>>}

"Клавиатура не исчезла после отмены статуса первого ответившего "

Кто-нибудь знает, что здесь происходит? Странно, кстати, похоже, что EarlGrey выбирает следующее поле (поле пароля) прямо перед ошибкой. У меня нет кода пользовательского интерфейса, чтобы вообще выбрать поле пароля.

ОБНОВЛЕНИЕ: я использую тип клавиши возврата «Далее» в этом текстовом поле, так что, когда пользователь нажимает клавишу возврата, я переношу его в следующее поле (поле пароля). Для этого, когда нажата клавиша Next, я убираю firstResponder в этом текстовом поле и вызываю «becomeFirstResponder» в поле пароля.

Это приводит к тому, что EarlGray выдает ошибку, потому что, если я удаляю вызов «resignFirstResponder», он правильно печатает мой текст. Вопрос в следующем: ПОЧЕМУ ОН НАЖИМАЕТ клавишу «Далее», когда я этого не говорю!?


person Community    schedule 24.03.2016    source источник
comment
Автозамена все еще включена для клавиатуры, когда она не может печатать? У EarlGrey есть поведение, при котором, если он обнаруживает, что автозамена включена, он увольняет первого ответившего, отключает автозамену из текстового поля и затем возвращается обратно. TTBOMK, в настоящее время модифицируется.   -  person gran_profaci    schedule 24.03.2016
comment
Исправление и проверка орфографии отключены. Тип клавиатуры по умолчанию. Внешний вид — по умолчанию. Клавиша возврата — «Далее» (которая переводит пользователя из поля имени пользователя в поле пароля).   -  person    schedule 24.03.2016
comment
Оператор [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@usernameTextField)] assertWithMatcher:grey_interactable()] PerformAction:grey_tap()]; кажется немного избыточным, поскольку typeText, следующий за ним, также должен выполнять все эти проверки. Не могли бы вы удалить это и проверить?   -  person gran_profaci    schedule 25.03.2016
comment
Я согласен, что это лишнее. У меня изначально этого не было, и он терпел неудачу. С тех пор я удалил его и снова убедился, что он все еще не работает.   -  person    schedule 25.03.2016
comment
ОБНОВЛЕНИЕ: я использую тип клавиши возврата «Далее» в этом текстовом поле, так что, когда пользователь нажимает клавишу возврата, я переношу его в следующее поле (поле пароля). Для этого при нажатии клавиши Next я убираю firstResponder в этом текстовом поле и вызываю функцию beFirstResponder в поле пароля. Это приводит к тому, что EarlGray выдает ошибку, потому что, если я удаляю вызов resignFirstResponder, он правильно печатает мой текст. Вопрос в следующем: ПОЧЕМУ ОН НАЖИМАЕТ клавишу Next, когда я не говорю об этом!?   -  person    schedule 25.03.2016


Ответы (1)


Похоже на ошибку в исходниках EarlGray. Строка 182 в GREYActions.m

// If the view already is the first responder and had autocorrect enabled, it must
  // resign and become first responder for the autocorrect type change to take effect.
  [firstResponder resignFirstResponder];

Нет никакой проверки, чтобы определить, была ли ранее включена автозамена в представлении. Таким образом, ВСЕ текстовые поля будут вызывать «resignFirstResponder». Это проблематично для таких установок, как моя, где resigningFirstResponder затем передает статус firstResponder в другое текстовое поле.

person Community    schedule 24.03.2016
comment
Вы должны открыть для них проблему на github github.com/google/EarlGrey/issues - person gran_profaci; 25.03.2016
comment
проблема, кажется, была обновлена. Это решит вашу проблему? - person gran_profaci; 02.05.2016