web-dev-qa-db-ja.com

UIテストのコードを介して「ソフトウェアキーボードを切り替える」ことは可能ですか?

ログイン機能をテストするUIテストがあります(そしてそれを使用して他のものをテストします)が、フォーカスが1つのフィールドから別のフィールドに変更されると、キーボードが非表示になり、カーソルがフィールドで点滅しているのに_field.typeText_-_no focused fields to fill_。

どういうわけか、_Hardware -> Keyboard -> toggle software keyboard_をクリックするとキーボードが画面に表示され続けるので、テストがうまく機能していることに気付きました。ただし、任意のテストデバイス、任意の開発者マシンで動作させる必要があるため、プロジェクトのreadmeで「テストが失敗した場合は、…に移動して…手動で設定」することなく、プログラムでこのオプションを設定したいと思います。

出来ますか?

20
extempl

シミュレーターの.plistファイルが変更され、複数のシミュレーターのサポートが追加されました。 ConnectHardwareKeyboardブール値がデバイスのUDIDの下にネストされるようになりました。幸いにも、このUDIDはplistファイルにも保存されます。このコードは、UITestターゲットのビルドフェーズで「スクリプトの実行」を使用して追加できます。

Xcode 9の回答:

#grab the UDID from the plist
UDID=$(defaults read com.Apple.iphonesimulator CurrentDeviceUDID)

#overwrite the existing value with false
#OR if the plist doesn't have that value add it in
/usr/libexec/PlistBuddy -c "Set :DevicePreferences:$UDID:ConnectHardwareKeyboard 
false" ~/Library/Preferences/com.Apple.iphonesimulator.plist 
|| 
/usr/libexec/PlistBuddy -c  "Add :DevicePreferences:$UDID:ConnectHardwareKeyboard
bool false" ~/Library/Preferences/com.Apple.iphonesimulator.plist

または、この他のコードを使用して、すべてのシミュレーターに影響を与えることができます。

/usr/libexec/PlistBuddy -c "Print :DevicePreferences" ~/Library/Preferences/com.Apple.iphonesimulator.plist | Perl -lne 'print $1 if /^    (\S*) =/' | while read -r a; do /usr/libexec/PlistBuddy -c "Set :DevicePreferences:$a:ConnectHardwareKeyboard
false" ~/Library/Preferences/com.Apple.iphonesimulator.plist || /usr/libexec/PlistBuddy -c  "Add :DevicePreferences:$a:ConnectHardwareKeyboard
bool false" ~/Library/Preferences/com.Apple.iphonesimulator.plist; done
14
Brooks DuBois

Xcode 9より前のバージョンでは、Simulator.appでハードウェアキーボードを無効にすることで回避できます。これにより、ソフトウェアキーボードが常に表示されます。例えば:

defaults write com.Apple.iphonesimulator ConnectHardwareKeyboard -bool NO

Xcode10.3およびXcode11でテスト済み。以下のスニペットは、アプリターゲット(テストバンドルではない)に配置する必要があります—たとえば、AppDelegate.SwiftUIKeyboardInputModeautomaticHardwareLayoutプロパティをnilに設定することにより、ハードウェアキーボードが自動的に接続されないようにします。

????シミュレータの設定に依存しません。

???? 注:これはSimulator 11.0(Xcode 11)で修正されたようです。

#if targetEnvironment(simulator)
// Disable hardware keyboards.
let setHardwareLayout = NSSelectorFromString("setHardwareLayout:")
UITextInputMode.activeInputModes
    // Filter `UIKeyboardInputMode`s.
    .filter({ $0.responds(to: setHardwareLayout) })
    .forEach { $0.perform(setHardwareLayout, with: nil) }
#endif

またはObjective-c:

#if TARGET_IPHONE_SIMULATOR
SEL setHardwareLayout = NSSelectorFromString(@"setHardwareLayout:");
for (UITextInputMode *inputMode in [UITextInputMode activeInputModes]) {
    if ([inputMode respondsToSelector:setHardwareLayout]) {
        // Note: `performSelector:withObject:` will complain, so we have to use some black magic.
        ((void (*)(id, SEL, id))[inputMode methodForSelector:setHardwareLayout])(inputMode, setHardwareLayout, NULL);
    }
}
#endif
4
Chris Zielinski

Brooksのすばらしい答えに従って、これはすべてのシミュレータで機能します。

/usr/libexec/PlistBuddy -c "Print :DevicePreferences" ~/Library/Preferences/com.Apple.iphonesimulator.plist | Perl -lne 'print $1 if /^    (\S*) =/' | while read -r a; do /usr/libexec/PlistBuddy -c "Set :DevicePreferences:$a:ConnectHardwareKeyboard
false" ~/Library/Preferences/com.Apple.iphonesimulator.plist || /usr/libexec/PlistBuddy -c  "Add :DevicePreferences:$a:ConnectHardwareKeyboard
bool false" ~/Library/Preferences/com.Apple.iphonesimulator.plist; done
4
Everton Cunha

Xcode 10.1でテストしました。さまざまなアプローチを試しましたが、シミュレーターUDIDを取得する方法を解決するものはありませんでした。

#Find the UDID of the booted simulator
#And use PlistBuddy to change the flag to true or false
#Set the variable useHardwareKeyboard with the desired result
#Relaunch the simulator
useHardwareKeyboard=false
export UDID=$(xcrun simctl list devices | grep "(Booted)" | grep -E -o -i "([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})")
/usr/libexec/PlistBuddy -c "Set :DevicePreferences:$UDID:ConnectHardwareKeyboard ${useHardwareKeyboard}" ~/Library/Preferences/com.Apple.iphonesimulator.plist
xcrun simctl shutdown $UDID
xcrun simctl boot $UDID

これらの変更を確認することもできます。

シミュレーターUDIDを見つけます:(詳細はこちら: https://nshipster.com/simctl/

xcrun simctl list devices | grep "(Booted)" | grep -E -o -i "([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})"

これらのコマンドの1つを実行し、上からのUDIDに基づいて変更を見つけます。

defaults read com.Apple.iphonesimulator
#OR
open ~/Library/Preferences/com.Apple.iphonesimulator.plist
1
Jorge Quezada

Xcode 10.2では、これらのソリューションはどれも機能しません。plistは正しく変更されますが、キーボードは非表示になります。キーボードが表示されない場合は、シミュレータでoascriptを使用してCtrl + Shift + Kを押す必要があります。それは美しさではありませんが、機能する唯一の回避策です。

tell application "Simulator" to activate
tell application "System Events"
    keystroke "K" using {command down, shift down}
end tell
0
real_kappa_guy