如果本机键盘出现在应用程序之前,如何在UIautomator中找到元素?

时间:2014-02-11 14:17:45

标签: appium

根据项目要求,我正在开发移动应用程序自动化。当我执行在模拟器上工作正常的相同代码时出现问题,但是当涉及到真实设备时,相同的代码变得失败。问题是UiAutomator无法定位元素,因为本机键盘在模拟期间来到应用程序之前。我将整个事情执行到了适用于ANDROID API 18的Galaxy nexus。因此无需在Selendroid模式下执行整个自动化套件。在第一个编辑框中填充值后的下面的代码中,控件应该到达第二个编辑框以填充值,依此类推。但它没有填补价值,因为原生键盘在应用之前出现。

            SwipeableWebDriver driver = new SwipeableWebDriver(
            new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    List<WebElement> editTextList = driver.findElements(By
            .className("android.widget.EditText"));

    editTextList.get(0).sendKeys(c + "Bob");
    editTextList.get(1).sendKeys("123");
    editTextList.get(2).sendKeys("456");
    el = driver.findElement(By.className("android.widget.Button"));
    el.click();

请有任何想法解决此问题的人吗? 提前谢谢。

Priyank Shah

9 个答案:

答案 0 :(得分:2)

首先,您应该了解软键盘是否处于活动状态 - 使用代码中的以下命令检查“mInputShown”参数 - 如果“true” - 活动软键盘。

 adb shell dumpsys input_method | grep mInputShown

使用此代码隐藏运行旧版appium的Java-appium中的本机键盘。

driver.navigate().back()

P.S - adb命令对仿真器没用,因为正在检查其值的标志始终设置为true,无论您的键盘是否处于活动状态。

答案 1 :(得分:1)

我认为你不能,并且它不是appium的限制。 从我观察到的甚至UIAutomator都找不到键盘隐藏的元素。

我知道2个解决方案:

  1. 关闭键盘。 (我没有找到任何优雅的方式,所以我没有使用它。
  2. 在视图上滑动/滚动,直到元素被曝光,然后您可以对其进行操作。这对我来说很好。

答案 2 :(得分:0)

您应该可以通过发送

来关闭键盘
driver.findElement(By.name("Return")).click();

答案 3 :(得分:0)

添加换行符也适用 editTextList.get(2).sendKeys(&#34; 456 \ n&#34);

答案 4 :(得分:0)

如果您可以检测到键盘已打开,我建议拨打UiDevice.pressBack()来解除键盘。

答案 5 :(得分:0)

您可以使用以下代码解除键盘

driver.hideKeyboard();

答案 6 :(得分:0)

列出以下两行: driver.getKeyboard(); driver.hideKeyboard();

答案 7 :(得分:0)

这是一个uiautomator就绪的全功能方法,如果键盘是打开的,它将响应为true,如果它是关闭的,则为false:

public static boolean isKeyboardDisplayed() {
    String checkKeyboardCommand = "dumpsys input_method | grep mInputShown";
    try {
        Process process = Runtime.getRuntime().exec(checkKeyboardCommand);
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        int read;
        char[] buffer = new char[4096];
        StringBuffer output = new StringBuffer();
        while ((read = reader.read(buffer)) > 0) {
            output.append(buffer, 0, read);
        }
        reader.close();
        process.waitFor();

        if (output.toString().contains("mInputShown=true")) {
            return true;
        } else {
            return false;
        }

    } catch (IOException e) {
        throw new RuntimeException(e);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

}

答案 8 :(得分:0)

您可能需要在android功能中启用unicodeKeyboard: true并使用键盘按钮Return(如果显示)隐藏键盘(在iOS和Android上适用于我)

例如,我正在使用ruby:

  element = $appium.find_element(id: field_id)
  element.clear
  element.send_keys(data)
  element.send_keys(:return) if driver.is_keyboard_shown