2015-08-24 37 views
76

這是我的情況:UI測試失敗 - 無論是元素和任何後代具有鍵盤焦點secureTextField

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

UI測試失敗 - 無論是元素和任何後代具有鍵盤焦點。元素:

出了什麼問題?這對正常的textFields工作很好,但問題只出現在secureTextFields。任何解決方法?

+0

我得到的[爲符合所述UIKeyInput協議一個UIView相同的錯誤(http://stackoverflow.com/questions/35740068/xcode -ui - 測試 - uikeyinput-的TypeText)。 – ma11hew28

回答

152

這個問題引起了我一個痛苦的世界,但我設法找出一個適當的解決方案。在模擬器中,確保'硬件 - >鍵盤 - >連接硬件鍵盤'關閉。

+0

我相信這是真正的答案。 UI記錄非常挑剔,所以可能有很多原因導致問題(典型的蘋果......),但是我得到了同樣的錯誤,並且這固定了它。這意味着你必須在模擬器上摳鍵,不能使用Mac上的鍵,否則錄製將失敗。 – shmim

+0

這也解決了我的問題。 –

+4

這解決了這個問題。但是它的解決方法非常糟糕,因爲我們無法爲CI自動應用它。 –

0

您的第一行只是一個查詢定義,這並不意味着passwordSecureTextField實際上會存在。

您的第二行將動態執行查詢並嘗試(重新)將查詢綁定到UI元素。你應該在它上面放置一個斷點,並確認找到了一個且只有一個元素。或者只是使用一個斷言:

XCTAssertFalse(passwordSecureTextField.exists); 

否則,它看起來不錯,tap應強制鍵盤可見,然後typeText應該只是工作。錯誤日誌應該告訴你更多的信息。

+1

'passwordSecureTextField'存在。我解決了這個問題,但是清理了內存,並重新編寫了這些代碼。奇怪的,但它的工作。 –

+0

很高興聽到它的修復!我遇到類似的問題,昨天與測試版6 :) – JOM

+0

測試版6?:-)真的嗎?我只有5個:) –

3

這可能有所幫助:我只是在錯誤之前添加「tap」動作; that's所有:)

[app.textFields[@"theTitle"] tap]; 
[app.textFields[@"theTitle"] typeText:@"kk"]; 
+1

這絕對不適用於安全密碼文本字段。 –

+0

這適用於我的安全密碼文本字段。好的解決方案 –

3
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() 
} 
+0

如果我把'false'的clearTest通過了 –

2

我需要做的模擬器>重置內容和設置在模擬器[轉貼Bartłomiej Semańczyk的作爲答案,因爲它解決了這個問題對我的評論]菜單欄,讓這個開始爲我工作。

+0

重置模擬器也幫助了我。有趣的是,這個問題只發生在模擬器上,而相同的測試(點擊texfield然後鍵入字符)在設備上運行良好。 – Christian

11

斯坦尼斯拉夫有正確的想法。

在團隊環境中,您需要一些能自動工作的東西。我在博客上提出了修復here

基本上你只粘貼:

UIPasteboard.generalPasteboard().string = "Their password" 
let passwordSecureTextField = app.secureTextFields["password"] 
passwordSecureTextField.pressForDuration(1.1) 
app.menuItems["Paste"].tap() 
+0

感謝您分享您的解決方案。不幸的是,它現在不適合我。我有Xcode 7.2(7C68),你呢?查看我們爲CI找到的其他解決方案:http://stackoverflow.com/questions/32184837/ui-testing-failure-neither-element-nor-any-descendant-has-keyboard-focus-on-se/34812979#34812979 。 –

10

我已經寫了一個小的擴展(雨燕),這對我的作品完美。 下面是代碼:

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)) 
     } 
    } 
} 

的主要思路是保持敲擊的元素(文本字段)提出的鍵盤前。

+0

這現在不適用於我。我有Xcode 7.2(7C68),你有什麼版本?我們爲CI找到的這個解決方案適用於我們:http://stackoverflow.com/a/34812979/598057。 –

+0

我使用相同的** Xcode **版本。 –

+0

再次確認一次:此幫助程序適用於**安全密碼文本字段**不只是常規文本字段? –

13

最近我們發現一個黑客可以從接受的答案中解決問題。要禁用模擬器設置:「硬件 - >鍵盤 - >連接硬件鍵盤」的命令行應該寫成:

defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0 

這不會影響其運行模擬器 - 你需要重新啓動模擬器或啓動一個新的使該設置發揮作用。

+0

這並沒有改變什麼。 – netshark1000

+0

@ netshark1000可能會更新版本的Xcode,我會檢查它。 – AlexDenisov

+0

非常有幫助,我需要相反的地方在鍵盤始終啓用,但是,這是非常感謝。我結束了與 '默認寫com.apple.iphonesimulator ConnectHardwareKeyboard-bool true',但它的概念相同。 – JJacquet

0

不要搞砸了,有問題的原因是你記錄你的測試時間你的應用程序將連接硬件鍵盤,而你的自動測試時間模擬器只需要軟件鍵盤。所以如何解決這個問題。只需在您的錄音時間使用軟鍵盤。你可以看到魔法。

3

無論你想要記錄的情況下,我的意思是與鍵盤或無鍵盤連接。 但在玩測試時請做以下操作。

enter image description here

此選項(硬件連接鍵盤),同時播放測試應該是選中。

0

對於我來說,問題和泰德一樣。實際上,如果在登錄字段和硬件KB處於打開狀態後輕敲字段被輕敲,軟件鍵盤將在第二個字段輕擊時自行消失,並且它不是特定於UI測試。

經過一段時間使用AppleScript亂搞,這裏就是我想出了(改進是歡迎):

tell application "Simulator" activate tell application "System Events" try tell process "Simulator" tell menu bar 1 tell menu bar item "Hardware" tell menu "Hardware" tell menu item "Keyboard" tell menu "Keyboard" set menuItem to menu item "Connect Hardware Keyboard" tell menu item "Connect Hardware Keyboard" set checkboxStatus to value of attribute "AXMenuItemMarkChar" of menuItem if checkboxStatus is equal to "✓" then click end if end tell end tell end tell end tell end tell end tell end tell on error tell application "System Preferences" activate set securityPane to pane id "com.apple.preference.security" tell securityPane to reveal anchor "Privacy_Accessibility" display dialog "Xcode needs Universal access to disable hardware keyboard during tests(otherwise tests may fail because of focus issues)" end tell end try end tell end tell

創建代碼的腳本文件上面,並把它添加到必要的目標(可能的UI測試只有目標,您可能需要爲開發目標添加類似的腳本以在開發過程中重新啓用硬件鍵盤)。 你應該在構建階段添加Run Script階段,像這樣使用: osascript Path/To/Script/script_name.applescript

4

它與我發生了很多次。 您必須禁用鍵盤硬件和相同的佈局OSX在模擬器

硬件/鍵盤(禁用所有)

該鍵盤軟件不會解散後,你的測試可以輸入文字

Disable Hardware

4

在文本框使用睡眠發動數據應用和輸入之間是這樣的:

sleep(2) 

在我的情況下,我每次都收到這個錯誤,只有這個解決方案幫助我解決了問題。

+0

這適用於我 – onmyway133

+0

問題是如果您有大量的UI測試執行類似於初始登錄的操作,這會給您的CI測試運行增加巨大的開銷。 – delta2flat

0

當爲包含UIControl子視圖的自定義視圖(UIStackView子類)設置accessibilityIdentifier值時,我們遇到了同樣的錯誤。在那種情況下,XCTest無法獲得後代元素的鍵盤焦點。

我們的解決方案是簡單地從我們的父視圖中刪除accessibilityIdentifier,並通過專用屬性爲子視圖設置accessibilityIdentifier

0

與Securetextfields有相同的問題。我的模擬器中的連接硬件選項是,但仍然遇到問題。最後,這個工作對我來說(SWIFT 3):

let enterPasswordSecureTextField = app.secureTextFields["Enter Password"] 
    enterPasswordSecureTextField.tap() 
    enterPasswordSecureTextField.typeText("12345678") 
1

此錯誤的另一個原因是如果在你試圖輸入被設置爲可訪問性元素文本(一個文本字段的父視圖view.isAccessibilityElement = true)。在這種情況下,XCTest無法獲得子視圖的句柄以輸入文本並返回錯誤。

UI測試失敗 - 任何元素或任何子孫都沒有鍵盤 焦點。

這並不是說沒有元素具有焦點(如你經常可以看到鍵盤並在的UITextField光標閃爍),它只是沒有元素它可以達到具有焦點。我嘗試在UISearchBar中輸入文本時遇到了這個問題。搜索欄本身不是文本字段,將它設置爲輔助功能元素時,對底層UITextField的訪問被阻止。爲了解決這個問題,在UISearchBar上設置了searchBar.accessibilityIdentifier = "My Identifier",但是isAccessibilityElement未設置爲true。在此之後,形式的測試代碼:

app.otherElements["My Identifier"].tap() 
app.otherElements["My Identifier"].typeText("sample text") 

作品