我正在尝试自动化一个邮政编码输入字段,该字段会弹出一个数字键盘供用户输入。
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()方法不适用于参数(字符串,字符串)”
任何人都可以帮助解决以上两个问题吗?
非常感谢!
答案 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));
}
}
}
对于我们在模拟器和模拟器上隐藏键盘的解决方案,该解决方案非常稳定