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 故障 - “退出第一响应者状态后键盘没有消失”的主要内容,如果未能解决你的问题,请参考以下文章