Android上的Appium - SendKeys到EditText也键入默认文本

时间:2014-09-15 06:55:26

标签: android wordpress appium

我正在尝试使用Appium for Android for Wordpress Mobile(https://github.com/wordpress-mobile/WordPress-Android)编写一些自动化测试。

我要做的第一件事就是在主登录界面输入用户名,以便能够登录我的Wordpress网站,而我在“用户名”字段中遇到SendKeys问题。

以下是uiautomatorviewer中元素的显示方式:

enter image description here

这是我到目前为止所尝试的内容:

List<WebElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
WebElement login = textFieldsList.get(0);       
login.sendKeys("username");

driver.findElementsByClassName("android.widget.EditText").get(0).sendKeys("username");

driver.findElement(By.xpath("//android.widget.EditText[@text='Editing. Username or email. ']")).sendKeys("username");

尝试发送“username”作为用户名的所有3个版本,当我运行测试时,该字段中实际输入的内容是:“编辑。用户名或电子邮件。用户名”

因此,似乎还保留了占位符文本,然后添加了我的用户名。

请注意,当我使用appium发送用户名时添加的文本首先不在那里(参见屏幕截图),但在UI树视图中,它似乎是EditText中的文本。当Appium运行测试时,在添加我自己的用户名之前,实际上正在编写“编辑。用户名或电子邮件”文本。

我也尝试过,正如其中一个答案中建议的那样:Appium : Clear a field 以下代码,其中sendKeyEvent(67)应清除该字段:

List<WebElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
WebElement login = textFieldsList.get(0);
login.click();
driver.sendKeyEvent(67);
login.sendKeys("username");

使用.clear()崩溃,我注意到其他人建议尽可能避免它。

当然,如果我尝试手动执行此操作,则不会添加占位符文本,只需键入即可在字段中添加用户名。

我也可以使用driver.sendKeyEvent()函数并发送我的一个字符,但我想将用户名作为参数发送,并能够在字段中键入任何用户名。

因为每当我尝试输入用户名时都会输入额外的文本,要解决此问题,我必须首先输入“用户名” - 在应用程序中,输入的实际文本是“编辑。用户名或电子邮件。用户名” - 然后将光标向左移动到“用户名”字样的前面并开始删除其余部分 - 但这非常慢。以下是以这种方式工作的代码:

        String setUsername = "username";
        login.click();
        login.sendKeys(setUsername);

        // hack to delete extra text that gets typed
        int stringLength = login.getText().length() - setUsername.length();
        for (int i = 0; i < setUsername.length(); i++) {
            driver.sendKeyEvent(21); //KEYCODE_DPAD_LEFT
        }
        for (int i = 0; i < stringLength; i++) {
            driver.sendKeyEvent(67); // "KEYCODE_DEL
        }

我错过了什么?任何帮助将不胜感激。我试图理解为什么额外的文本被输入。

5 个答案:

答案 0 :(得分:3)

经过大量搜索,我发现这确实是Appium v​​ 1.2.2中的一个错误:

https://discuss.appium.io/t/android-appium-1-2-2-sendkeys-issue-with-hinted-edit-text/309

希望正如在那里所说的那样,它将在版本1.2.3中修复。

感谢您的帮助!

答案 1 :(得分:0)

问题是你只使用了一次sendKeyEvent(67)而且没有适当的地方。你要做的是首先将光标设置在Text in Login字段的末尾,然后逐个删除每个字母,直到字段中不再留下任何文本。

例如:尝试这样的事情

   WebElement login = textFieldsList.get(0);// Get the webelement where text is to be entered
      string str = login.Text;// it will store the Text already written in login field
        int textLength = str.Length;// find the lenght of the text that is to be removed
        int x = login.Location.X +(textLength * 40); //
        int y = login.Location.Y;//
        TouchAction action = new TouchAction(driver);// TouchAction class is defined in appium library
        action.Tap(testObject, x, y);// 
        for (int delete = 0; delete < str.Length; delete++)
        {
           rm.KeyEvent(67);
        }
    }

希望有所帮助......

答案 2 :(得分:0)

您正在寻找

MobileElement textfield = driver.findElement(By.however(value))

textfield.setValue('foo')

我没有在Android上测试过这个功能,但它是在iOS / Instruments上textfield.sendKeys不可靠的情况下构建的。

您还可以尝试textfield.click()textfield.clear(),然后textfield.sendKeys('foo')

Example usage

您需要Appium java-client

答案 3 :(得分:0)

您可能希望降级一个版本,因为我认为此错误在上一版本中不存在。

答案 4 :(得分:0)

我看到您使用了List并且屏幕截图上有3个文本字段 - 为什么不使用这些字段的索引来传递您的值?这样就无法为其添加额外的文字。

List<WebElement> tfl=driver.findElements(By.className("android.widget.EditText"));
     tfl.get(0).sendKeys("username"); // tfl=text field list
     tfl.get(1).sendKeys("password");