天天看點

軟體測試 | 特殊控件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霍格沃茲的幹貨都很硬核