【问题标题】:Appium sendKeys really slow on androidAppium sendKeys在android上真的很慢
【发布时间】:2015-03-07 16:28:15
【问题描述】:

我目前正在 Android 设备上使用 Appium 测试应用程序(appium 版本:1.2.4.1,java-client:2.1.0)。我正在使用以下代码在 textField 中发送一些文本:

   driver.findElement(By.name("Name")).sendKeys("My Name");

它工作得很好,只是在文本框上实际发送文本需要很长时间(通常是 7 秒)。我想知道有没有人知道另一种在 textField 上发送文本的方法更少?

谢谢!

【问题讨论】:

  • 请,在发布有关 Appium 的问题时,请务必记住指定以下信息: - 安装和运行 Appium 的操作系统 - 您是在真实设备或模拟器/模拟器上运行测试吗? - 您在哪些平台上进行测试? iOS 还是安卓?
  • 它也取决于机器操作系统。我在 windows 和 Linux 上执行了相同的代码,但是有大约 50% 的差异。

标签: java android testing appium


【解决方案1】:

我用 adb 代替 appium 发送文本解决了这个问题!真的很快!

try {
     textElement.click();  
     new ProcessBuilder(new String[]{"adb", "-s", "YOURDEVICEUUID", "shell", "input", "text", "YOURTEXTASINPUT"})
       .redirectErrorStream(true)
       .start();
} catch (IOException e) {
   e.printStackTrace();
}

同样的方式你可以用它来点击、清除、安装、卸载等。同步问题可能需要一些线程睡眠,但它只有 50 毫秒,这比 appium 需要的 5 秒还少! 您可以使用 DDMLIB 来进行此 adb 调用,而不是 ProcessBuilder!

【讨论】:

  • 试过了,但是,文本没有出现在文本字段上,也没有显示错误,我该如何调试?
【解决方案2】:

试试:

driver.findElement(By.name("Name")).Click();
driver.Keyboard.SendKeys("My Name");

这应该比你的方法运行得更快。

【讨论】:

    【解决方案3】:

    这项功能帮助我减少了在 Android 上的输入时间

    desiredCapabilities.setCapability("ignoreUnimportantViews", true);
    desiredCapabilities.setCapability("disableAndroidWatchers", true);
    

    你可以在这里找到更多https://appium.io/docs/en/writing-running-appium/caps/#android-only

    【讨论】:

      【解决方案4】:

      在 Appium 上经历缓慢的自动化很常见,因为 Appium 基于客户端/服务器架构。网络问题会影响测试的性能(除非您在安装了 Appium 的同一台机器上运行测试)。

      我可以告诉你,我也遇到过 Appium 测试缓慢的问题。顺便说一句,它通常发生在模拟器/模拟器上。

      在 UX 场景中发送密钥

      如果您的测试需要在用户体验场景中发送密钥,那么SendKeys 是您唯一的选择。该方法不只是在文本框中设置值,它实际上的行为就像用户按下键并将键发送到文本框。

      如果这是您需要的,那么您需要了解网络级别发生了什么,因为这就是您的问题所在。还要考虑到这种方法有时会很慢(这是我的经验)。

      设置文本对于正在测试的 UX 场景并不重要

      如果为正在考虑的特定测试设置文本框值的步骤不是自动化的核心部分,您总是可以通过ExecuteScript 来实现这一点,它允许您在应用程序中执行 Javascript 代码。我假设您正在自动化 WebView 上下文。

      int result = driver.executeScript("
          try {
              var el = document.getElementById('<your-txtbox-id-here>');
              el.value = '<your-text-here>';
              return 0;
          } catch {
              return 1;
          }
      ");
      

      Java 不支持多行字符串,所以前面是以下内容的漂亮打印:

      int result = driver.executeScript("try{var el = document.getElementById('<your-txtbox-id-here>');el.value = '<your-text-here>';return 0;}catch{return 1;}");
      

      如果字符串设置成功,此方法将返回0,否则返回1。它应该更快,因为驱动程序不会单独发送每个密钥,而是在匿名函数中执行脚本并取回其返回值。

      【讨论】:

      • 我收到异常说 executeScript 尚未实现。请指定客户端和服务器的版本。
      • 这里的延迟一样,都是在同一台机器上运行的,我怀疑是不是和网络有关,尤其是点击按钮非常快,只输入文本很慢。
      【解决方案5】:

      尝试添加以下功能以获得appium键盘(而不是物理键盘)

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

      【讨论】:

      • 有趣,但不,它没有帮助。
      • 它对我有用,这就是我提出它的原因;)也许你下次会使用它!
      • 是的,当然。允许设备不显示键盘,这本身就很有趣
      • 每秒输入大约 1 个字符,速度非常慢。添加这些 setCapabilities 后,它开始每秒输入 10 个字符。谢谢!
      【解决方案6】:

      sendKeys 替换为appium 更高版本中可用的setValue 方法:

      driver.findElement(By.name("Name")).setValue("My Name");
      

      根据我的经验,它要快得多。

      【讨论】:

      • 虽然setValue() 肯定快得多,但它不支持 unicode - 如果使用 setValue(),请记住这一点。
      【解决方案7】:

      对于新手来说,在Appium 1.9版~,executeJavaScript()setValue()这两种方法都很好用,可以考虑使用。

      // use js
      executeJavaScript("$('#" + fieldId + "').val(testData);
      
      // use setValue
      $(By.id(fieldId)).setValue(testData);
      

      【讨论】:

        【解决方案8】:

        我使用以下方法提高了测试速度(用 Python 编写):

        driver.set_value(myElement, "My Name")
        

        代替:

        webElement.send_keys("My Name")
        

        如果您使用的是 Java,它将类似于:

        driver.setValue(driver.findElement(By.name("Name")), "My Name")
        

        另一种方法可能是使用 adb...(这是最快的方法,但您必须使用除 appium 之外的其他方法)

        //1st - Click at your WebElement 
        driver.click(driver.findElement(By.name("Name")))
        
        //2nd - Using adb send your text
        //adb shell input text "My Name"
        adb shell input keyboard text "My Name"
        

        【讨论】:

        • 你说的adb方法变了。现在应该是:adb shell input keyboard text "My\ Name"。另请注意,adb 方式不支持 unicode 字符(尽管如果您将键盘设置为 unicode 可能是可能的,我只是不知道该怎么做)。
        • 我不知道:adb shell 输入键盘文本...我仍在使用其他方法,但我想已弃用?谢谢,我会按照你的方式进行。关于 Unicode,我想我从来没有尝试过用 ADB 输入 unicode。但我想你是对的。
        猜你喜欢
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 2014-06-13
        • 2020-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多