Appium hidekeyboard()方法

时间:2019-03-05 03:34:03

标签: appium appium-ios

我正在尝试自动化一个邮政编码输入字段,该字段会弹出一个数字键盘供用户输入。 Appium可以正确输入邮政编码,但是在折叠键盘时遇到问题,我注意到有一个appium方法awk

但是不幸的是,使用它时会出错。

Webdriver错误:

driver.hidekeyboard()

Appium服务器日志:

org.openqa.selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: [object Object]

我还注意到有一种键盘替代方法,其参数为: https://github.com/appium/java-client/blob/1991a8a0f9e4a3ff467dbb713cb5c51c8edc060f/src/main/java/io/appium/java_client/HidesKeyboardWithKeyName.java

debug] [JSONWP Proxy] Matched '/element/undefined/click' to command name 'click'
[debug] [JSONWP Proxy] Proxying [POST /element/undefined/click] to [POST http://localhost:8100/session/83293E4F-4B7A-462A-B5B1-1D729D54E36B/element/undefined/click] with body: {}
[debug] [XCUITest] Connection to WDA timed out
[debug] [iProxy] recv failed: Operation not permitted
[debug] [JSONWP Proxy] Got response with status 200: {"value":{},"sessionId":"83293E4F-4B7A-462A-B5B1-1D729D54E36B","status":13}
[JSONWP Proxy] Got an unexpected response: {"value":{},"sessionId":"83293E4F-4B7A-462A-B5B1-1D729D54E36B","status":13}
[debug] [MJSONWP] Matched JSONWP error code 13 to UnknownError
[debug] [XCUITest] Connection to WDA timed out
[debug] [iProxy] recv failed: Operation not permitted
[debug] [W3C (bac0efb8)] Encountered internal error running command: UnknownError: An unknown server-side error occurred while processing the command. Original error: [object Object]
[debug] [W3C (bac0efb8)]     at errorFromMJSONWPStatusCode (/usr/local/lib/node_modules/appium/node_modules/_appium-base-driver@3.14.0@appium-base-driver/lib/protocol/errors.js:789:10)
[debug] [W3C (bac0efb8)]     at ProxyRequestError.getActualError (/usr/local/lib/node_modules/appium/node_modules/_appium-base-driver@3.14.0@appium-base-driver/lib/protocol/errors.js:683:14)
[debug] [W3C (bac0efb8)]     at JWProxy.command (/usr/local/lib/node_modules/appium/node_modules/_appium-base-driver@3.14.0@appium-base-driver/lib/jsonwp-proxy/proxy.js:234:19)
[HTTP] <-- POST /wd/hub/session/bac0efb8-601a-4558-a50c-f909f2ccb25a/appium/device/hide_keyboard 500 1

但是无论我是否导入了必要的类,它都仍然说“ HidesKeyboard类型的hideKeyboard()方法不适用于参数(字符串,字符串)”

任何人都可以帮助解决以上两个问题吗?

非常感谢!

8 个答案:

答案 0 :(得分:1)

如在Appium当前已知的未解决问题中列出的那样,在iPhone设备上使用Appium方法hideKeyboard()众所周知不稳定。在iOS设备上使用此方法可能会导致Appium脚本挂起。 Appium发现问题是因为-“没有用于隐藏键盘的自动化钩子,而不是使用此方法,而是考虑用户如何在应用程序中隐藏键盘,并告诉Appium这样做(滑动,点击某个坐标,等等……)“

解决方法:按照Appium文档的建议-使用Appium自动执行用户用来隐藏键盘的操作。例如,如果应用程序定义了此动作,则使用swipe方法隐藏键盘;或者,如果应用程序定义了“隐藏KB”按钮,则自动单击此按钮。

另一种解决方法是使用 sendkey(),而无需单击文本输入字段。

答案 1 :(得分:0)

已知Appium方法hideKeyboard()在iPhone设备上使用时不稳定,如Appium当前已知的未解决问题中所列出。在iOS设备上使用此方法可能会导致Appium脚本挂起。 Appium发现问题是因为-“没有用于隐藏键盘的自动化钩子,而不是使用此方法,而是考虑用户如何在应用程序中隐藏键盘,并告诉Appium这样做(滑动,点击某个坐标等。

如果要隐藏键盘,可以编写如下功能

public void typeAndEnter(MobileElement mobileElement, String keyword) {
        LOGGER.info(String.format("Typing %s ...",keyword));
        mobileElement.sendKeys(keyword, Keys.ENTER);
    }

希望这会有所帮助

答案 2 :(得分:0)

您也可以简单地使用

driver.navigate()。back(); (适用于较早版本的appium)

答案 3 :(得分:0)

您可以这样定义功能。

desiredCapabilities.setCapability("unicodeKeyboard", true);
desiredCapabilities.setCapability("resetKeyboard", true);

答案 4 :(得分:0)

如果您使用的是Android,则可以使用adb隐藏键盘,从代码中发送adb命令

adb shell input keyevent 111

答案 5 :(得分:0)

如果您使用的是android,请使用以下方法。

如果键盘可见(按ID)

 driver.pressKeyCode(4);  //Android back button

其他

 logger keyboard is not active

以上方法将通过调用系统后退按钮关闭键盘。

答案 6 :(得分:0)

解决此问题的最佳方法是,只需在程序中添加capability

capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "uiautomator2");

答案 7 :(得分:0)

    public void clickAfterFindingElement(By by) {
        try {
            getDriver().waitForCondition(ExpectedConditions.elementToBeClickable(by));
            getDriver().findElement(by).click();
        } catch (NoSuchElementException | TimeoutException e) {
            swipeUp();
            getDriver().findElement(by).click();
        }
    }


    public void hideKeyBoard() {
        if (isKeyboardShown()) {
            if (isConfigurationIOS()) {
                try {
                    clickAfterFindingElement(By.id("keyboard_done_btn"));
                } catch (Exception e) {
                    try {
                        getDriver().click(By.id("Done"));
                    } catch (Exception e1) {
                        //noop
                    }
                }
            } else {
                ((AndroidDriver) getDriver().getAppiumDriver()).pressKey(new KeyEvent(AndroidKey.BACK));
            }
        }
    }

对于我们在模拟器和模拟器上隐藏键盘的解决方案,该解决方案非常稳定