Appium中很經典的問題了,在兩年前也就是2017年3月6號07:22分,我纔看到appium1.6.3版本的發佈,更新內容爲Ios上能夠實現Toast的獲取,而Windows也就是安卓端,還須要等待,惋惜在那會沒有mac本,很遺憾,沒法動手嘗試,這個問題就一直擱置了,當時還發了個朋友圈記錄下當時的心情。以下圖:java
Android中的Toast是一種消息提示彈框,且Toast顯示時間有限,通常3秒左右就消失,沒法使用定位元素工具定位,且沒法被點擊操做。node
簡單理解,就是彈窗提示語,即你操做行爲以後給出的提示,好比微信app的登陸功能,你輸入正確帳號,密碼,點擊登陸,會提示正在登陸灰色一散而過的信息,以下圖:android
必須命令安裝,客戶端desktop這種確定不行,就別試驗了,卸載客戶端apache
npm unistall -g appium
appium -v
appium -v
若是第二步還存在說明appium安裝到其餘目錄下了,查看appium路徑:which appium,此時可能會輸出路徑爲【/usr/local/bin/appium】,進到這個目錄下手動刪除appium文件夾,再輸入:appium -v,此時應該就沒有,提示:zsh: command not found: appiumnpm
cnpm install -g appium@1.10.0
ps:沒錯,就是1.10.0版本的好用,降版本操做微信
再輸入:appium -v,此時應該就有1.10.0版本提示了app
cnpm install appium-uiautomator2-driver
安裝成功後能夠在 C:\Users\Administrator\node_modules看到對應的文件:工具
_appium-uiautomator2-driver@1.12.0@appium-uiautomator2-driver
_appium-uiautomator2-server@1.10.0@appium-uiautomator2-server
去上圖目錄下,找到這兩個apk,安裝到手機便可ui
capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);
具體示例代碼:spa
import com.neuxa.autotest.report.RtAnnotation; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.remote.AutomationName; import io.appium.java_client.remote.MobileCapabilityType; import org.apache.commons.io.FileUtils; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; import org.testng.TestNGException; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.List; import java.util.concurrent.TimeUnit; /** * @author rongrong * 獲取toast信息 */ @RtAnnotation(caseId = "666", bugId = "無bug號關聯") public class TestGetToast { AndroidDriver<WebElement> driver; @BeforeClass(alwaysRun = true) public void setUp() throws Exception { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "127.0.0.1:62001"); capabilities.setCapability("platformName", "Android"); capabilities.setCapability("deviceName", "Android Emulator"); // 設置app的主包名和主類名(要啓動應用包名和activity) capabilities.setCapability("appPackage", "com.tencent.mm"); //app包名 capabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI"); //要啓動的Android Activity名 capabilities.setCapability("appActivity", ".ui.LauncherUI"); capabilities.setCapability("noReset", true); capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2); // driver實例 driver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } /** * 登陸功能驗證 */ @Test public void testGetToast() { try { driver.findElement(By.id("d0v")).click(); driver.findElement(By.id("dc")).click(); pause(1); driver.findElement(By.id("d0o")).click(); pause(1); List<WebElement> elements = driver.findElements(By.id("m6")); elements.get(0).sendKeys("1"); elements.get(1).sendKeys("1"); pause(1); driver.findElement(By.id("d0p")).click(); WebElement element = new WebDriverWait(driver, 30).until(new ExpectedCondition<WebElement>() { public WebElement apply(WebDriver driver) { return driver.findElement(By.xpath("//*[contains(@text, '正在')]")); } }); String toast = element.getText(); System.out.println("toast : " + toast); driver.findElement(By.id("b47")).click(); } catch (AssertionError e) { Assert.fail(getClass().getName() + " >> " + e.getMessage()); } catch (Exception e) { throw new TestNGException(getClass().getName() + e.getMessage(), e); } } @AfterClass public void afterTestStopDriver() { driver.quit(); } /** * 程序暫停幾秒 * * @param i */ public void pause(int i) { try { Thread.sleep(i * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
實現效果: