Appium sendKeys在android上真的很慢

xnifntxz  于 2023-04-18  发布在  Android
关注(0)|答案(9)|浏览(286)

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

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

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

ruarlubt

ruarlubt1#

我用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 ms,这是太少了5秒,appium需要!你可以使用DDMLIB来使这个adb调用,而不是ProcessBuilder!

rslzwgfq

rslzwgfq2#

尝试:

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

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

t1qtbnec

t1qtbnec3#

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

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

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

nlejzf6q

nlejzf6q4#

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

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。它应该更快,因为驱动程序不会单独发送每个键,而是在匿名函数中执行脚本并返回其返回值。

qhhrdooz

qhhrdooz5#

尝试添加以下功能以便拥有appium键盘(而不是物理键盘)

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

kq0g1dla6#

sendKeys替换为appium后续版本中可用的setValue方法:

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

根据我的经验,它更快。

5cg8jx4n

5cg8jx4n7#

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

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

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

wwodge7n8#

我提高了我的测试(用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"
6ojccjat

6ojccjat9#

设置在capabilities:

desiredCapabilities.setCapability("appium:disableWindowAnimation", true);

相关问题