【问题标题】:Appium on Android - SendKeys to EditText also types default textAndroid 上的 Appium - SendKeys 到 EditText 还键入默认文本
【发布时间】:2014-11-08 15:27:49
【问题描述】:

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

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

这是元素在 uiautomatorviewer 中的显示方式:

这是我迄今为止尝试过的:

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");

尝试发送“用户名”作为用户名的所有 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
        }

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

【问题讨论】:

    标签: android wordpress appium


    【解决方案1】:

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

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

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

    感谢您的帮助!

    【讨论】:

      【解决方案2】:

      问题是您只使用了一次 sendKeyEvent(67),而且在不合适的地方也是如此。您需要做的是首先将光标设置在“登录中的文本”字段的末尾,然后继续逐个删除每个字母,直到该字段中不再有文本。

      例如:尝试这样的事情

         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);
              }
          }
      

      希望对你有帮助..

      【讨论】:

      • 感谢您的回答,但这无济于事。正如我所提到的,文本尚未写入文本字段,它是在 Appium 键入我要发送的用户名时键入的。所以一开始没有什么要删除的,但是当我输入时,它会输入“正在编辑...”+我实际要求它输入的用户名。
      • 我只能通过首先输入用户名,然后将光标向后移动直到我要输入的用户名超过光标,然后开始删除其余部分来解决它。但这需要很长时间。我也会编辑问题以反映这一点。
      • 您应该先清除该字段,然后输入用户名。
      • 感谢您的评论,但正如我提到的,每次我使用“sendKeys”时都会输入额外的文本,所以之前清除没有帮助。如果我清除,然后键入,则再次键入额外的文本。
      【解决方案3】:

      你正在寻找

      MobileElement textfield = driver.findElement(By.however(value))
      
      textfield.setValue('foo')
      

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

      你也可以试试textfield.click()textfield.clear(),然后textfield.sendKeys('foo')

      Example usage

      你需要 Appium java-client

      【讨论】:

      • 我尝试过使用 textfield.setValue('foo') 但我收到一条错误消息:“尚未实现。请帮助我们:appium.io/get-involved.html(警告:服务器未提供任何堆栈跟踪information)(..)" 我的 pom.xml 的所有版本都设置为 "LATEST" - 所以我想我有最新版本的 appium java-client 和 selenium webdriver...
      • 使用 textfield.clear() 的其他解决方案将不起作用,因为正如我所说,每次我执行 sendKeys() 时都会输入额外的文本,所以它一开始就不存在清除...
      • 啊。我找到了this。试试setValueImmediate(我想当你.click()ed 时,文本可能会被填充)
      • 另外,如果你在 Appium 的话语帮助小组上提问,引导和 jlipps 在那里非常活跃。
      • 我检查了那里的讨论组,发现这是一个错误,将在未来的版本中修复。 discuss.appium.io/t/…
      【解决方案4】:

      你可能想降级一个版本,因为我认为这个错误在上一个版本中不存在。

      【讨论】:

        【解决方案5】:

        我看到您使用了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");
        

        【讨论】:

          猜你喜欢
          • 2012-02-29
          • 1970-01-01
          • 2015-03-07
          • 1970-01-01
          • 2014-10-21
          • 2012-05-26
          • 2013-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多