天天看点

软件测试 | 特殊控件Toast识别

作者:霍格沃兹测试

1.Toast简介

Toast是Android系统中的一种消息框类型,它属于一种轻量级的消息提示框类型,常常以小弹框的形式出现,一般出现1~2秒回自动消失。它可以出现在屏幕中任意位置。它不同于Dialog(对话框),它没有焦点。Toast的设计思想是尽可能地不引人注意,同时还想用户显示信息,并希望用户可以看到。

测试App下载地址:

https://GitHub 网站/appium/sample-code/raw/master/samlpe-code/apps/ApiDemos/bin/ApiDemos-debug.apk。

首先将上面地址的apk包下载到本地计算机上,并安装到模拟器中;在模拟器中打开API Demos,依次点击 “ Views” →“Popup Menu” →“Make a Popup”→“Search”项,就会弹出消息提示框,如图5-18所示。

图5-18中“Clicked popup menu item Search”就是 Toast,它通常在页面上停留的时间只有2秒左右,测试中用Appium Inspector一般不容易获取到这个提示框元素。

2.获取Toast

在模拟器中打开API Demos,依次点击 “ Views” →“Popup Menu”→ “Make a Popup”→“Search”项,查找页面的Toast元素。

示例代码如下(Python版和Java版)

(1)Python演示代码

# 设置 capabilities
caps = {}
caps["platformName"] = "Android"
caps["appPackage"]="io.appium.android.apis"
caps["appActivity"] = ".ApiDemos"
#必须使用 UiAutomator2框架
caps["automatorName"]="uiautomator2"
caps["deviceName"]="hogwarts"
#与Appium Server 建立连接
driver = webdriver.Remote("http://localhost:4723/wd/hub",caps)
#设置隐式等待
driver.implicitly_wait(5)

#点击Views项
driver.find_element_by_accessibility_id("Views").click()
#滑动页面
TouchAction(driver).press(380,1150)\
  .move_to(380,150).release().perform()
#点击'Popup Menu'项目
driver.find_element_by_xpath(
"///[@content-desc='Popup Menu']").click()
#点击'Make a Popup!'项
driver.find_element_bu_xpath(
"//*[@content-desc=='Make a Popup!']").click()
#点击'Search'项
driver.find_element_by_xpath("//*[contains(@test,'Search')]").click()
toastXPath = "//*[@class='android.wight.Toast']"
#打印totastXPath
print(driver.find_element_by_xpath(toastXPath))
#打印toastXPath 获取的text
print(driver.find_element_by_xpath(toastXPath).text)           

(2)Java演示代码

@BeforeAll
public static void setuo() throws MalformedURLException{
    DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
    desiredCapabilities.setCapability("platfromName","Android");
    desiredCapabilities.setCapability("appPackage","io.appium.android.apis");
    desiredCapabilities.setCapability("appActivity",".ApiDemos");
    desiredCapabilities.setCapability("automationName","uiautomator2");
    desiredCapabilities.setCapability("deviceName","hogwarts");
    URL remoteUrl = new URL("http://127.0.0.1:4723/wd/hub");
    driver = new AndroidDriver(remoteUrl,desiredCapabilities);
    driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
}

@Test
public void toastTest(){
    //点击Views项
    driver.findElement(MobileBy.AccessibilityId("views")).click();
    //滑动页面
    TouchAction action = new TouchAction(driver);
    PointOption pressPointOne = PointOption.point(380,1150);
    PointOption pressPointOne = pointOption.point(380,150);
    action.press(pressPointOne).moveTo(movePointOne).release();
    //点击'Popup Menu'项目
    driver.findElement(By.xpath("//*[@contest-desc='Popup Menu']")).click();
    //点击'Make a Popup!'项目
    driver.findElement(By.xpath("//*[@content-desc='Make a Popup!']")).click();
    //点击'Search'项
    driver.findElement(By.xpath"//*[@contains(@text,'Search')"])).click();
    By toastXPath = By.xpath("//*[@class='android.widget.Toast']");
    //打印 toastXPath
    System.out.println(driver.findElement(toastXPath));
    //打印 toastXPath 获取的text
    System.out.println(driver.findElement(toastXPath));
    //打印 toastXPath获取的text
    System.out.println(driver.findElement(toastXPath).getText());
}           

上述代码中定位Toast使用了XPath表达式,因为Toast的class属性比较特殊,页面中一般会出现一次 class=“android.widget.Toast”的元素,所以使用XPath定位方式搭配隐式等待就可以很轻松地定位到Toast。

上述代码执行结果如下。

[[Android: uiautomator2] -> xpath://*[@class='android.widget.Toast']]
Clicked popup menu item Search
PASSED:testToast           

搜索微信公众号:TestingStudio霍格沃兹的干货都很硬核