1. 程式人生 > >Appium系列|其他定位方式

Appium系列|其他定位方式

上篇文章介紹了ID的定位方式本文介紹控制元件跟文字的方式。

控制元件型別定位方式

接著我們來介紹下第二種定位方式,按控制元件型別的定位方式。有時候控制元件沒有id,這時候我們可以運用控制元件型別來定位,一個頁面上相同型別的控制元件一般會有多個,因此按控制元件型別定位一般也會結合index來進行定位。

假如現在我們要定位開源中國應用首頁底部的第二個tab頁,我們可以通過uiaumatorviewer來觀察控制元件資訊,發現它是有ID的,因此可以使用ID來定位,這裡我們想通過控制元件型別來定位,可以通過工具獲得控制元件型別是android.widget.FrameLayout,當前頁面android.widget.FrameLayout型別的控制元件有很多,我們通過工具發現它的父級控制元件是有ID的,我們可以通過先獲得它的父級控制元件,然後在根據父級控制元件去找子控制元件,這樣就可以縮小範圍,具體控制元件資訊如下圖所示:

通過上圖可以看到假設要定位到第二個tab頁,按控制元件型別FrameLayout定位的話,第二個tab頁的index應該是2,也就是第三個,所以編寫如下測試程式碼進行定位:

package appium.chapter2;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.io.File;
import java.net.URL;

public class ClassTypeTest {
   private AppiumDriver<WebElement> driver;

   @BeforeMethod
   public void setUp() throws Exception {
       //構造被測試應用的路徑
       File app = new File(System.getProperty("user.dir"), "AUT/osc.apk");
       //例項化DesiredCapabilities
       DesiredCapabilities capabilities = new DesiredCapabilities();
       //deviceName的值可以任意指定
       capabilities.setCapability("deviceName","My Device");
       //設定被測應用的絕對路徑
       capabilities.setCapability("app", app.getAbsolutePath());
       capabilities.setCapability("appPackage","net.oschina.app");
       //設定啟動類的資訊,這個資訊可以通過aapt dump bading apkname來獲得
       capabilities.setCapability("appActivity", ".AppStart");
       //初始化AppiumDriver
       driver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
   }

   @Test
   public void testName() throws Exception {
       //等待控制元件出現,後續再介紹只能等待的方法
       Thread.sleep(4000);
       //定位到底部tab欄的父級控制元件
       WebElement parentView = driver.findElementById("net.oschina.app:id/fag_nav");
       //通過父控制元件去找子控制元件
       WebElement secondTab = parentView.findElements(By.className("android.widget.FrameLayout")).get(2);
       //點選第二個tab欄
       secondTab.click();
   }

   @AfterMethod
   public void tearDown() throws Exception {
       driver.quit();
   }
}

文字定位方式

接著來介紹下按文字的定位方式,這是一種最快捷的定位方式,如果是不考慮後期維護下的話,如果控制元件剛好有文字的屬性,按文字定位是最快的,都不需要用到元素檢視的工具uiautomatorviewer就可以直接定位了。Appium並沒有直接提供按文字定位的方法但可以通過其他定位方式來進行構造,假如想定位首頁的問答頁,如下圖所示:

可以編寫如下測試程式碼進行定位:

package appium.chapter2;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.io.File;
import java.net.URL;

public class TextTest {
   private AppiumDriver<WebElement> driver;

   @BeforeMethod
   public void setUp() throws Exception {
       //構造被測試應用的路徑
       File app = new File(System.getProperty("user.dir"), "AUT/osc.apk");
       //例項化DesiredCapabilities
       DesiredCapabilities capabilities = new DesiredCapabilities();
       //deviceName的值可以任意指定
       capabilities.setCapability("deviceName","My Device");
       //設定被測應用的絕對路徑
       capabilities.setCapability("app", app.getAbsolutePath());
       capabilities.setCapability("appPackage","net.oschina.app");
       //設定啟動類的資訊,這個資訊可以通過aapt dump bading apkname來獲得
       capabilities.setCapability("appActivity", ".AppStart");
       //初始化AppiumDriver
       driver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
   }


   @Test
   public void testName() throws Exception {
       Thread.sleep(3000);
       //通過xpath構建,任意型別的控制元件,它的文字屬性為問答的定位方式如下
       WebElement qaTab = driver.findElement(By.xpath("//*[@text='問答']"));
       qaTab.click();
   }

   @AfterMethod
   public void tearDown() throws Exception {
       driver.quit();
   }
}