Ini kasus saya:
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("wrong_password") //here is an error
Kegagalan Pengujian UI - Tidak ada elemen maupun turunan yang memiliki fokus keyboard. Elemen:
Apa yang salah? Ini berfungsi dengan baik untuk normal textFields
, tetapi masalah hanya muncul dengan secureTextFields
. Ada solusi?
Jawaban:
Masalah ini membuat saya sangat menderita, tetapi saya telah berhasil menemukan solusi yang tepat. Di Simulator, pastikan 'Hardware -> Keyboard -> Connect hardware keyboard' dimatikan.
sumber
Baru-baru ini kami menemukan peretasan untuk membuat solusi dari jawaban yang diterima tetap ada. Untuk menonaktifkan pengaturan Simulator: 'Hardware -> Keyboard -> Connect hardware keyboard' dari baris perintah seseorang harus menulis:
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0
Ini tidak akan memengaruhi simulator yang sedang berjalan - Anda perlu memulai ulang simulator atau memulai yang baru agar pengaturan tersebut memiliki efeknya.
sumber
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool true
, tetapi konsepnya sama.killall "Simulator"; defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0;
Saya telah menulis ekstensi kecil (Swift) yang berfungsi sempurna untuk saya. Ini kodenya:
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)) } } }
Ide utamanya adalah tetap mengetuk elemen (bidang teks) sebelum keyboard disajikan.
sumber
Stanislav punya ide yang benar.
Dalam lingkungan tim, Anda membutuhkan sesuatu yang secara otomatis akan berfungsi. Saya menemukan perbaikan di sini di blog saya.
Pada dasarnya Anda hanya menempelkan:
UIPasteboard.generalPasteboard().string = "Their password" let passwordSecureTextField = app.secureTextFields["password"] passwordSecureTextField.pressForDuration(1.1) app.menuItems["Paste"].tap()
sumber
Penyebab lain kesalahan ini adalah jika ada tampilan induk bidang teks tempat Anda mencoba memasukkan teks yang disetel sebagai elemen aksesibilitas (
view.isAccessibilityElement = true
). Dalam kasus ini, XCTest tidak bisa mendapatkan pegangan pada subview untuk memasukkan teks dan mengembalikan kesalahan.Bukannya tidak ada elemen yang memiliki fokus (seperti yang sering Anda lihat pada keyboard dan kursor berkedip di UITextField), hanya saja tidak ada elemen yang dapat dijangkau yang memiliki fokus. Saya mengalami ini ketika mencoba memasukkan teks di UISearchBar. Bilah pencarian itu sendiri bukanlah bidang teks, saat menyetelnya sebagai elemen aksesibilitas, akses ke UITextField yang mendasarinya telah diblokir. Untuk mengatasi hal ini,
searchBar.accessibilityIdentifier = "My Identifier"
ditetapkan padaUISearchBar
namunisAccessibilityElement
tidak ditetapkantrue
. Setelah ini, uji kode formulir:app.otherElements["My Identifier"].tap() app.otherElements["My Identifier"].typeText("sample text")
Bekerja
sumber
Itu terjadi dengan saya berkali-kali. Anda harus menonaktifkan Perangkat Keras Keyboard dan Tata Letak yang Sama dengan OSX di Simulator Anda
Hardware / Keyboard (nonaktifkan semua)
Setelah itu, perangkat lunak keyboard tidak akan ditutup dan pengujian Anda dapat mengetik teks
sumber
Gunakan mode tidur antara meluncurkan aplikasi dan mengetik data di bidang teks seperti ini:
sleep(2)
Dalam kasus saya, saya terus mendapatkan kesalahan ini setiap saat dan hanya solusi ini yang membantu saya.
sumber
Dalam kasus saya ini
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Nonaktifkan tidak berhasil untuk saya.Tapi saat aku mengikutinya
1)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Diaktifkan dan jalankan aplikasi2)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Nonaktifkan .Itu berhasil untuk saya
sumber
Ini mungkin membantu: Saya hanya menambahkan tindakan "ketuk" sebelum kesalahan; itu saja :)
[app.textFields[@"theTitle"] tap]; [app.textFields[@"theTitle"] typeText:@"kk"];
sumber
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() }
sumber
Rekam case sesuka Anda, keyboard atau tanpa keyboard terpasang. Tapi lakukan hal berikut sebelum bermain tes.
Opsi berikut ini (sambungkan keyboard perangkat keras) harus dicentang saat memainkan tes.
sumber
[ Memposting ulang komentar Bartłomiej Semańczyk sebagai jawaban karena itu memecahkan masalah saya]
Saya perlu melakukan Simulator> Atur Ulang Isi dan Pengaturan di bilah menu simulator agar ini mulai berfungsi untuk saya.
sumber
Terkadang bidang teks tidak diterapkan sebagai bidang teks, atau digabungkan ke dalam elemen UI lain dan tidak dapat diakses dengan mudah. Berikut cara melakukannya:
sumber
Baris pertama Anda hanyalah definisi kueri , yang tidak berarti itu
passwordSecureTextField
benar-benar ada.Baris kedua Anda akan secara dinamis menjalankan kueri dan mencoba mengikat (kembali) kueri ke elemen UI. Anda harus meletakkan breakpoint padanya dan memverifikasi bahwa satu dan hanya satu elemen yang ditemukan. Atau gunakan saja assert:
XCTAssertFalse(passwordSecureTextField.exists);
Jika tidak, tampilannya oke,
tap
harus memaksa keyboard terlihat dan kemudiantypeText
berfungsi. Log kesalahan seharusnya memberi tahu Anda info lebih lanjut.sumber
passwordSecureTextField
ada. Saya memperbaiki masalah, tetapi membersihkan memori, dan menulis ulang baris itu lagi. Aneh, tapi berhasil.tap
untuk saya, butuh waktu untuk mengetahuinya. Praktik debug yang bagus!Jangan mengacaukan, Ada masalah yang tertangkap karena Anda mencatat waktu pengujian aplikasi Anda akan menghubungkan keyboard perangkat keras sementara simulator waktu pengujian otomatis hanya membutuhkan keyboard perangkat lunak. jadi untuk cara memperbaiki masalah ini. Cukup gunakan keyboard perangkat lunak pada waktu perekaman Anda. Anda bisa melihat keajaiban.
sumber
Masalah bagi saya sama dengan Ted. Sebenarnya jika bidang kata sandi diketuk setelah bidang masuk dan KB perangkat keras aktif, keyboard perangkat lunak akan menutup dirinya sendiri pada ketukan bidang kedua, dan ini tidak khusus untuk tes UI.
Setelah beberapa waktu bermain-main dengan AppleScript, inilah yang saya hasilkan (peningkatan dipersilakan):
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
Buat file skrip dengan kode di atas dan tambahkan ke target yang diperlukan (mungkin hanya target tes UI, Anda mungkin ingin menambahkan skrip serupa ke target pengembangan Anda untuk mengaktifkan kembali keyboard HW selama pengembangan). Anda harus menambahkan
Run Script
fase dalam fase build dan menggunakannya seperti ini:osascript Path/To/Script/script_name.applescript
sumber
Kami mengalami kesalahan yang sama saat menyetel
accessibilityIdentifier
nilai untuk tampilan kustom (UIStackView
subclass) yang berisiUIControl
subview. Dalam kasus tersebut XCTest tidak bisa mendapatkan fokus keyboard untuk elemen turunannya.Solusi kami hanyalah menghapus
accessibilityIdentifier
dari tampilan induk kami dan mengaturaccessibilityIdentifier
subview melalui properti khusus.sumber
Jawaban lain, tetapi bagi kami masalahnya adalah tampilan itu terlalu dekat dengan tampilan lain yang merupakan pengenal Gesture di atasnya. Kami menemukan bahwa kami memerlukan tampilan setidaknya 20 piksel (dalam kasus kami di bawah). Secara harfiah 15 tidak berhasil dan 20 atau lebih berhasil. Ini aneh saya akui, tetapi kami memiliki beberapa UITextView yang berfungsi dan beberapa tidak dan semuanya berada di bawah induk yang sama dan pemosisian lain yang identik (dan tentu saja nama variabel). Keyboard hidup atau mati atau apa pun tidak ada bedanya. Aksesibilitas menunjukkan bidang. Kami memulai ulang komputer kami. Kami melakukan clean build. Checkout sumber baru.
sumber
Saya mengalami masalah ini dan dapat memperbaikinya dalam skenario saya dengan mengambil solusi yang diposting oleh @AlexDenisov dan menambahkannya ke tindakan awal saya untuk menjalankan & menguji .
sumber
Tidak Perlu menyalakan / mematikan keyboard di I / O. Jangan gunakan .typeText untuk secureTextField, gunakan saja
app.keys["p"].tap() app.keys["a"].tap() app.keys["s"].tap() app.keys["s"].tap()
Bonus: Anda mendapatkan suara keyboard klik :)
sumber
Akhirnya, saya menulis skrip yang mengedit file .plist Simulator dan menyetel
ConnectHardwareKeyboard
propertinya ke false untuk simulator yang dipilih. Anda dengar itu benar, itu mengubah properti untuk simulator yang dipilih secara khusus di dalam kamus "DevicePreferences" daripada mengedit properti global.Pertama, buat skrip shell bernama disable-hardware-keyboard.sh dengan konten berikut. Anda dapat menempatkannya di dalam "YourProject / xyzUITests / Scripts /" .:
echo "Script: Set ConnectHardwareKeyboard to false for given Simulator UDID" if [[ $1 != *-*-*-*-* ]]; then echo "Pass device udid as first argument." exit 1 else DEVICE_ID=$1 fi DEVICE_PREFERENCES_VALUE='<dict><key>ConnectHardwareKeyboard</key><false/></dict>' killall Simulator # kill restart the simulator to make the plist changes picked up defaults write com.apple.iphonesimulator DevicePreferences -dict-add $DEVICE_ID $DEVICE_PREFERENCES_VALUE open -a Simulator # IMPORTANT
Sekarang ikuti langkah-langkah ini untuk memanggilnya dengan meneruskan udid simulator yang dipilih sebagai argumen:
Script di dalam Tes> Tindakan sebelumnya:
#!/bin/sh # $PROJECT_DIR is path to your source project. This is provided when we select "Provide build settings from" to "AppTarget" # $TARGET_DEVICE_IDENTIFIER is the UDID of the selected simulator sh $PROJECT_DIR/xyzUITests/Scripts/disable-hardware-keyboard.sh $TARGET_DEVICE_IDENTIFIER # In order to see output of above script, append following with it: # | tee ~/Desktop/ui-test-scheme-prescript.txt
Saatnya mengujinya:
sumber
Memiliki masalah yang sama dengan Securetextfields. Opsi menghubungkan perangkat keras di Simulator saya adalah, tetapi masih mengalami masalah. Akhirnya, ini berhasil untuk saya (Swift 3):
let enterPasswordSecureTextField = app.secureTextFields["Enter Password"] enterPasswordSecureTextField.tap() enterPasswordSecureTextField.typeText("12345678")
sumber
Yang memperbaiki masalah ini bagi saya adalah menambahkan tidur 1 detik:
let textField = app.textFields["identifier"] textField.tap() sleep(1) textField.typeText(text)
sumber