使用 UIAutomation 为 iOS 模拟器禁用硬件键盘

Disable Hardware Keyboard for iOS Simulator using UIAutomation

我正在 iOS 模拟器中使用 UIAutomation 进行一些自动化测试。

在Xcode6中,iOS模拟器的keyboard behavior changed与真实设备相似,现在有一个菜单项connect/disconnect你的Mac 的键盘到模拟器:Hardware > Keyboard > Connect Hardware Keyboard.

我不介意这一点,但是当您的 Mac 的键盘已连接时,模拟器将不再显示软件键盘。当您 运行 使用 UIAutomation 的测试脚本时,像 UIATarget.localTarget().frontMostApp().keyboard().typeString("myString"); 这样的调用将失败,因为键盘不会出现,即使您已将文本字段设置为第一响应者。

这很烦人,因为如果我在模拟器中进行任何手动测试,我需要记得在 运行 我的任何 UIAutomation 测试之前禁用硬件键盘,否则它们都会失败。

有没有什么方法可以从 UIAutomation JS 脚本中检查硬件键盘设置并禁用它们?或者,在执行 UIAutomation 脚本之前,有什么方法可以从命令行执行此操作?

如果我没有正确理解您的问题,您需要采用防弹方式来输入文本。我只是为此使用 setValue 。像这样:UIATarget.localTarget().frontMostApp().textFields().Login.setValue('sofa');

我写了一个 AppleScript that sets the state of the hardware keyboard [other versions],你可以这样执行:

bash$ osascript scripts/set_hardware_keyboard.applescript 0
menu item Connect Hardware Keyboard of menu Keyboard of menu item Keyboard of menu Hardware of menu bar item Hardware of menu bar 1 of application process iOS Simulator
bash$

它在 Illuminator 中可用 target().connectHardwareKeyboard(),因此要确保在每次测试前禁用硬件键盘 运行,您需要在设置中执行此操作:

automator.setCallbackPrepare(function () {
         target().connectHardwareKeyboard(false);
 });

因为 Ian 的脚本在网络上不再可见,这里我的 Apple 脚本变体关闭了硬件键盘。

tell application "Simulator"
    activate
end tell

tell application "System Events"
    set hwKB to value of attribute "AXMenuItemMarkChar" of menu item "Connect Hardware Keyboard" of menu 1 of menu item "Keyboard" of menu 1 of menu bar item "Hardware" of menu bar 1 of application process "Simulator"
    if ((hwKB as string) is equal to "missing value") then
      do shell script "echo 'hardware keyboard is off'"
    else
      click menu item "Connect Hardware Keyboard" of menu 1 of menu item "Keyboard" of menu 1 of menu bar item "Hardware" of menu bar 1 of application process "Simulator"
    end if
end tell

更新了 Leo 对 Xcode 11 的回答的 AppleScript,其中 "Hardware" 已更改为 "I/O"。为了让它工作 Xcode 11.4.1 我需要一个 bash 脚本包装器来调用 AppleScript scpt 文件。

文件
./禁用硬件键盘
./disable-hardware-keyboard.scpt

tell application "Simulator"
    activate
end tell

tell application "System Events"
    set hwKB to value of attribute "AXMenuItemMarkChar" of menu item "Connect Hardware Keyboard" of menu 1 of menu item "Keyboard" of menu 1 of menu bar item "I/O" of menu bar 1 of application process "Simulator"
    if ((hwKB as string) is equal to "missing value") then
        do shell script "echo 'hardware keyboard is off'"
    else
        click menu item "Connect Hardware Keyboard" of menu 1 of menu item "Keyboard" of menu 1 of menu bar item "I/O" of menu bar 1 of application process "Simulator"
    end if
end tell
#!/bin/bash
cd $(dirname [=11=])
osascript disable-hardware-keyboard.scpt