UI测试失败 - 无论是元素还是任何后代都没有将键盘焦点放在secureTextField上

Bar*_*zyk 117 xcode ios swift ios9 xcode-ui-testing

这是我的情况:

let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("wrong_password") //here is an error
Run Code Online (Sandbox Code Playgroud)

UI测试失败 - 元素和任何后代都没有键盘焦点.元件:

怎么了?这对正常工作很好textFields,但只会出现问题secureTextFields.任何解决方法?

小智 193

这个问题给我带来了痛苦的世界,但我已经设法找到了一个合适的解决方案.在模拟器中,确保"硬件 - >键盘 - >连接硬件键盘"已关闭.

  • 你救了我的职业生涯 (18认同)
  • 如果在CI(Jenkins等)上运行测试,则可以在运行测试之前在脚本中设置以下参数."默认写入com.apple.iphonesimulator ConnectHardwareKeyboard 0" (15认同)
  • 这对我来说并不能解决问题.我可以清楚地看到文本字段获得焦点,键盘向上,但测试框架永远不能使用typeText:方法输入文本 (7认同)
  • 这解决了这个问题.但由于我们无法自动将其应用于CI,因此解决方法非常糟糕. (4认同)
  • 在 Xcode 11 上为我工作,但取消选中“连接硬件键盘”可能还不够。另外还必须确保软件键盘确实显示(我实际上遇到过没有连接硬件键盘,并且没有显示软件键盘的情况,即使文本字段具有焦点并且光标在闪烁)。 (3认同)
  • 我在 Xcode 11 上也遇到了这个问题。本地修复了,但是如何在 CI 中设置呢? (2认同)

Ale*_*sov 17

最近我们发现了一个黑客从接受的答案持久化解决方案.要禁用模拟器设置:'硬件 - >键盘 - >连接硬件键盘'从命令行应该写:

defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0
Run Code Online (Sandbox Code Playgroud)

它不会影响正在运行的模拟器 - 您需要重新启动模拟器或启动新模拟器才能使该设置生效.

  • 我在构建阶段创建了一个脚本来做到这一点。但是我需要杀死所有模拟器,所以我做到了:`killall“ Simulator”; 默认写com.apple.iphonesimulator ConnectHardwareKeyboard 0;` (2认同)

Ole*_*ndr 14

我写了一个小扩展(Swift),对我来说非常适合.这是代码:

extension XCTestCase {

    func tapElementAndWaitForKeyboardToAppear(element: XCUIElement) {
        let keyboard = XCUIApplication().keyboards.element
        while (true) {
            element.tap()
            if keyboard.exists {
                break;
            }
            NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 0.5))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

主要思想是在键盘出现之前继续点击元素(文本字段).

  • 这个答案的问题在于它使用了硬编码延迟。相反,请使用带有键盘元素的等待期望模型。 (2认同)

Rya*_*ske 11

斯坦尼斯拉夫有正确的想法.

在团队环境中,您需要能够自动运行的东西.我想出了一个修复这里在我的博客.

基本上你只需粘贴:

UIPasteboard.generalPasteboard().string = "Their password"
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.pressForDuration(1.1)
app.menuItems["Paste"].tap()
Run Code Online (Sandbox Code Playgroud)


use*_*320 7

导致此错误的另一个原因是,如果您试图输入被设置为可访问性元素(view.isAccessibilityElement = true)的文本,则在文本字段的父视图中进行操作。在这种情况下,XCTest无法获得子视图上的句柄以输入文本并返回错误。

UI测试失败-元素或任何后代都不具有键盘焦点。

并不是没有元素具有焦点(您经常会在UITextField中看到键盘向上和光标闪烁),而是它可以到达的任何元素没有焦点。尝试在UISearchBar中输入文本时遇到了这个问题。搜索栏本身不是文本字段,将其设置为可访问性元素时,将阻止对基础UITextField的访问。为了解决这个问题,searchBar.accessibilityIdentifier = "My Identifier"是在设置UISearchBar但是isAccessibilityElement未设置为true。之后,请测试以下形式的代码:

app.otherElements["My Identifier"].tap()
app.otherElements["My Identifier"].typeText("sample text")
Run Code Online (Sandbox Code Playgroud)

作品


Bha*_*Rao 7

就我而言,这Hardware -> Keyboard -> Connect Hardware Keyboard->禁用对我不起作用。

但是当我跟着

1) Hardware -> Keyboard -> Connect Hardware Keyboard->启用并运行应用程序
2) Hardware -> Keyboard -> Connect Hardware Keyboard->禁用

它对我有用


小智 5

func pasteTextFieldText(app:XCUIApplication, element:XCUIElement, value:String, clearText:Bool) {
    // Get the password into the pasteboard buffer
    UIPasteboard.generalPasteboard().string = value

    // Bring up the popup menu on the password field
    element.tap()

    if clearText {
        element.buttons["Clear text"].tap()
    }

    element.doubleTap()

    // Tap the Paste button to input the password
    app.menuItems["Paste"].tap()
}
Run Code Online (Sandbox Code Playgroud)


Fer*_*nez 5

它在我身上发生了很多次。您必须在模拟器中禁用键盘硬件和与OSX相同的布局

硬件/键盘(全部禁用)

之后,键盘软件将无法关闭,您的测试可以键入文本

禁用硬件


Kin*_*one 5

在启动应用程序和在文本字段中输入数据之间进行睡眠,如下所示:

sleep(2)
Run Code Online (Sandbox Code Playgroud)

就我而言,我每次都会不断收到此错误,只有这种解决方案帮助了我。

  • 问题是,如果您有大量的 UI 测试执行诸如初始登录之类的操作,这将为您的 CI 测试运行增加巨大的开销。 (2认同)