Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓上的Appium sendKeys真的很慢_Java_Android_Testing_Appium - Fatal编程技术网

Java 安卓上的Appium sendKeys真的很慢

Java 安卓上的Appium sendKeys真的很慢,java,android,testing,appium,Java,Android,Testing,Appium,我目前正在android设备上使用Appium测试一个应用程序(Appium版本:1.2.4.1,java客户端:2.1.0)。我使用以下代码在文本字段中发送一些文本: driver.findElement(By.name("Name")).sendKeys("My Name"); 它工作正常,只是在文本框中实际发送文本所花费的时间太长(通常为7秒)。我想知道是否有人知道另一种在文本字段上发送文本的方法,这种方法花费更少 谢谢 由于Appium基于客户机/服务器体系结构,因此在Appiu

我目前正在android设备上使用Appium测试一个应用程序(Appium版本:1.2.4.1,java客户端:2.1.0)。我使用以下代码在文本字段中发送一些文本:

   driver.findElement(By.name("Name")).sendKeys("My Name");
它工作正常,只是在文本框中实际发送文本所花费的时间太长(通常为7秒)。我想知道是否有人知道另一种在文本字段上发送文本的方法,这种方法花费更少


谢谢

由于Appium基于客户机/服务器体系结构,因此在Appium上遇到缓慢的自动化是很常见的。网络问题可能会影响测试的性能(除非您在安装Appium的同一台计算机上运行测试)

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

作为用户体验场景的一部分发送密钥 如果您的测试需要在用户体验场景中发送密钥,那么
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;
    }
");
int result=driver.executeScript(“
试一试{
var el=document.getElementById(“”);
el.值='';
返回0;
}抓住{
返回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;}");
int result=driver.executeScript(“try{var el=document.getElementById(“”);el.value='';return 0;}catch{return 1;}”);
如果字符串设置成功,此方法将返回
0
,否则返回
1
。它应该更快,因为驱动程序不会单独发送每个密钥,而是在匿名函数中执行脚本并返回其返回值。

尝试:

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

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

尝试添加以下功能,以便使用appium键盘(而不是物理键盘)


我通过使用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毫秒,这是太少于5秒的appium需要!
您可以使用DDMLIB而不是ProcessBuilder进行此adb调用

sendKeys
替换为appium更高版本中提供的
setValue
方法:

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

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

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

而不是:

webElement.send_keys("My Name")
如果您使用的是Java,它将类似于:

driver.setValue(driver.findElement(By.name("Name")), "My Name")
另一种方法是与亚洲开发银行合作。。。(这是最快的一款,但您必须使用appium之外的另一款)


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

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

新的Cube您可以在这里找到更多的内容,在AppIII版本1.9中,两种方法<代码> ExujTeJavaScript()<代码> &代码> StValueSo()/代码>工作得很好,您可以考虑使用它。

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

// use setValue
$(By.id(fieldId)).setValue(testData);

在发布有关Appium的问题时,请始终记住指定以下信息:-安装并运行Appium的操作系统-您是否在真实设备或模拟器/模拟器上运行测试?-您在哪些平台上进行测试?iOS还是Android?这也取决于机器操作系统。我在windows和Linux上执行了相同的代码,但有大约50%的差异。我得到一个异常,说executeScript尚未实现。请指定客户端和服务器的版本。这里的延迟相同,因为所有东西都在同一台机器上运行,我怀疑这与网络有关,特别是因为点击按钮速度非常快,只输入文本速度很慢。有趣,但不,这没有帮助。这对我有效,这就是我建议它的原因;)也许你下次会用它!当然可以。这使得设备不显示键盘,这本身就很有趣。它每秒输入大约1个字符,速度非常慢。添加这些设置功能后,它开始每秒键入10个字符。谢谢虽然
setValue()
肯定快得多,但它不支持unicode——如果使用
setValue()
,您应该记住这一点。您提到的adb方法已经改变了。现在应该是:
adb shell输入键盘文本“My\Name”
。还要注意的是,adb方式不支持unicode字符(尽管如果您的键盘设置为unicode,这可能是可能的,我只是不知道如何做到)。我不知道:adb shell输入键盘文本。。。我仍在使用另一种方法,但我想它已被弃用了?谢谢,我会走你的路。关于Unicode,我想我从来没有尝试过用ADB输入Unicode。但是我想你是对的。尝试过这样做,但是文本字段上没有显示文本,也没有显示错误,我如何调试它?
//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"
desiredCapabilities.setCapability("ignoreUnimportantViews", true);
desiredCapabilities.setCapability("disableAndroidWatchers", true);
// use js
executeJavaScript("$('#" + fieldId + "').val(testData);

// use setValue
$(By.id(fieldId)).setValue(testData);