簡體   English   中英

Appium sendKeys在android上真的很慢

[英]Appium sendKeys really slow on android

我目前正在Android設備上使用Appium測試應用程序(appium版本:1.2.4.1,java-client:2.1.0)。 我正在使用以下代碼在textField中發送一些文本:

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

它工作得很好,實際上在文本框上發送文本需要太長時間(通常為7秒)。 我想知道是否有人知道在textField上發送文本的另一種方式,需要更少?

謝謝!

我通過使用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來進行此adb調用而不是ProcessBuilder!

試試:

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

這應該比你的方法運行得更快。

更換sendKeyssetValue在appium的更高版本可用的方法:

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

我的體驗要快得多。

在Appium上經歷慢速自動化很常見,因為Appium基於客戶端/服務器架構。 網絡問題可能會影響測試的性能(除非您在安裝了Appium的同一台計算機上運行測試)。

我可以告訴你,我也遇到過Appium緩慢測試的問題。 它通常發生在模擬器/仿真器上。

發送密鑰作為UX方案的一部分

如果您的測試需要在用戶體驗場景中發送密鑰,那么SendKeys是您唯一的選擇。 此方法不是簡單地在文本框中設置值,它實際上就像用戶按下鍵並將鍵發送到文本框。

如果這是您所需要的,那么您需要了解網絡級別正在發生的事情,因為這就是您的問題所在。 還要考慮這種方法有時可能很慢(這是我的經驗)。

對於要測試的UX方案,設置文本並不重要

如果設置文本框值的步驟不是您正在考慮的特定測試的自動化的核心部分,您始終可以通過ExecuteScript實現此目的,該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 它應該更快,因為驅動程序不會單獨發送每個鍵,而是在匿名函數中執行腳本並獲取其返回值。

這些功能幫助我減少了Android上的輸入時間

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

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

對於新的commer,在Appium版本1.9~中, executeJavaScript()setValue()方法executeJavaScript()好用,你可以考慮使用它。

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

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

嘗試添加以下功能以便使用appium鍵盤(而不是物理鍵盤)

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

我使用以下方法提高了測試速度(用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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM