前言
Appium中很经典的问题了,在两年前也就是2017年3月6号07:22分,我才看到appium1.6.3版本的发布,更新内容为Ios上可以实现Toast的获取,而Windows也就是安卓端,还需要等待,可惜在那会没有mac本,很遗憾,无法动手尝试,这个问题就一直搁置了,当时还发了个朋友圈记录下当时的心情。如下图:
什么是Toast?
Android中的Toast是一种消息提示弹框,且Toast显示时间有限,一般3秒左右就消失,无法使用定位元素工具定位,且无法被点击操作。
简单理解,就是弹窗提示语,即你操作行为之后给出的提示,比如微信app的登录功能,你输入正确账号,密码,点击登录,会提示正在登录灰色一散而过的信息,如下图:
环境(win10系统)
- Appium:1.15.1
- JAVA Client:6.1.0
- JAVA:1.8
- Android模拟器:7.0
- SDK
准备工作
必须命令安装,客户端desktop这种肯定不行,就别试验了,卸载客户端
1、先卸载最新版本的appium
npm unistall -g appium
2、查看电脑中还有没有appium
appium -v
3、如没有,需要npm安装检验appium版本验证
appium -v
如果第二步还存在说明appium安装到其他目录下了,查看appium路径:which appium,此时可能会输出路径为【/usr/local/bin/appium】,进到这个目录下手动删除appium文件夹,再输入:appium -v,此时应该就没有,提示:zsh: command not found: appium
4、再重新安装appium指定版本
cnpm install -g appium@1.10.0
ps:没错,就是1.10.0版本的好用,降版本操作
再输入:appium -v,此时应该就有1.10.0版本提示了
6、安装appium-uiautomator2-driver
cnpm install appium-uiautomator2-driver
安装成功后可以在 C:UsersAdministrator ode_modules看到对应的文件:
_appium-uiautomator2-driver@1.12.0@appium-uiautomator2-driver
_appium-uiautomator2-server@1.10.0@appium-uiautomator2-server
7、安装appium-uiautomator2-server-v1.12.0.apk、appium-uiautomator2-server-debug-androidTest.apk
去上图目录下,找到这两个apk,安装到手机即可
代码实现
- 初始化中加入如下代码:
capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);
- 定位toast元素
具体示例代码:
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信息 */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(); } } }
实现效果: