EarlGrey 故障 - “退出第一响应者状态后键盘没有消失”

Posted

技术标签:

【中文标题】EarlGrey 故障 - “退出第一响应者状态后键盘没有消失”【英文标题】:EarlGrey Failure - "Keyboard did not disappear after resigning first responder status" 【发布时间】:2016-03-24 19:51:55 【问题描述】:

我正在尝试为我的登录页面编写 UI 测试。该页面有一些介绍动画、一个搜索字段(用于查找要连接的正确服务器),然后一旦他们选择了正确的服务器,就会出现一个用户名和密码字段。

这是我目前的测试:

[[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 然后正确选择了 usernameTextField,但随后 未能 输入文本,超时后出现以下错误:

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 在出错之前选择了下一个字段(密码字段)。我根本没有用于选择密码字段的 UI 代码。

更新:我在此文本字段上使用返回键类型“下一步”,这样当用户点击返回键时,我会将他们带到下一个字段(密码字段)。为此,当按下 Next 键时,我在该文本字段上退出 firstResponder,并在密码字段上调用“becomeFirstResponder”。

这导致 EarlGray 出错,因为如果我删除“resignFirstResponder”调用,那么它会正确键入我的文本。问题是:为什么它在我不告诉它的时候点击“下一步”键!?

【问题讨论】:

键盘输入失败时自动更正是否仍然开启? EarlGrey 有一种行为,如果它发现自动更正已打开,则它会辞去第一响应者的职务,从文本字段中关闭自动更正,然后返回。 TTBOMK,目前正在修改。 更正和拼写检查均已关闭。键盘类型为默认值。外观是“默认”返回键是“下一个”(将用户从用户名字段带到密码字段)。 语句“[[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"usernameTextField")] assertWithMatcher:grey_interactable()] performAction:grey_tap()];”似乎有点多余,因为它后面的 typeText 也应该进行所有这些检查。你能把它去掉并检查一下吗? 我同意这是多余的。我最初没有那个,它失败了。此后我已将其删除,并再次验证它仍然失败。 更新:我在此文本字段中使用返回键类型“下一步”,因此当用户点击返回键时,我会将它们带到下一个字段(密码字段)。为此,当按下 Next 键时,我在该文本字段上退出 firstResponder,并在密码字段上调用“becomeFirstResponder”。这导致 EarlGray 出错,因为如果我删除“resignFirstResponder”调用,那么它会正确键入我的文本。问题是:为什么它在我不告诉它的时候点击“下一步”键!? 【参考方案1】:

这看起来像是 EarlGray 源代码中的错误。 GREYActions.m 中的第 182 行

// 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 状态传递给另一个文本字段。

【讨论】:

你应该为他们打开一个github问题github.com/google/EarlGrey/issues 问题似乎已更新。这样就解决了你的问题?

以上是关于EarlGrey 故障 - “退出第一响应者状态后键盘没有消失”的主要内容,如果未能解决你的问题,请参考以下文章

EarlGrey 可以使用多个可访问性标签或文本

Google推出iOS功能性UI测试框架EarlGrey

iOS:两次运行相同测试后出现 Earlgrey/Detox 错误

如何在 EarlGrey 中使用 tapAtPoint

在 EarlGrey 中,等待元素出现的非轮询方式是啥?

Google推出iOS功能性UI测试框架EarlGrey