文章目錄
- 背景
- 前置條件
- 主要實作
- 元素讀取工具類
- 讀取檔案操作方法
- 元素等待查找工具類
- 元素定位類
- 基礎啟動類
- 業務組合測驗類
- 總結
背景
自動化是為業務測驗服務,如果資料與業務放在一起看起來不是專業,把資料與業務分離是完全必要的,這也是市場常見的資料驅動框架,今天咱們就聊一聊怎么搭建自己資料驅動框架,
前置條件
Appium 環境搭建成功,不會參考自動化工具之 Appium 入門文章,實在不會在參考網上怎么搭建,
- 移動端自動化測驗工具 Appium 快速入門
主要實作
UI 自動化框架元素放文本存盤、資料存盤、代碼直接存盤等其實隨便那個都行,只有自己用者方便就行,我作業中用文本檔案存盤,這樣修改方便,腳本放 SVN/Git 管理就行,UI 自動元素操作基本常見的就是 ID/NAME/XPATH 等這幾種,咱們寫一個工具轉換類即可,
元素讀取工具類
/**
* 移動端元素定位
*
* @return
* @param: name
*/
public By getLocatorApp(String name) {
String locator = properties.getProperty(name.trim());
String locatorType = locator.split(">>")[0].toLowerCase();
String locatorValue = locator.split(">>")[1];
if (locatorType != null && locatorType != null) {
logger.info("獲取元素key: " + name + "\t 獲取的定位型別:" + locatorType + "\t 獲取的定位運算式: " + locatorValue);
// 根據 locatorType 的變數值內容判斷,回傳何種定位方式的 By 物件
return getkeyVule(locatorType, locatorValue);
} else {
new RuntimeException("元素沒有獲取到!");
return null;
}
}
/**
* 讀取元素
* @param locatorType
* @param locatorValue
* @return By
*/
public By getkeyVule(String locatorType, String locatorValue) {
if ("id".equals(locatorType.toLowerCase())) {
return By.id(locatorValue);
} else if ("name".equals(locatorType.toLowerCase())) {
return By.name(locatorValue);
} else if (("classname".equals(locatorType.toLowerCase())) || ("class".equals(locatorType.toLowerCase()))) {
return By.className(locatorValue);
} else if (("tagname".equals(locatorType.toLowerCase())) || ("tag".equals(locatorType.toLowerCase()))) {
return By.className(locatorValue);
} else if (("linktext".equals(locatorType.toLowerCase())) || ("link".equals(locatorType.toLowerCase()))) {
return By.linkText(locatorValue);
} else if ("partiallinktext".equals(locatorType.toLowerCase())) {
return By.partialLinkText(locatorValue);
} else if (("cssselector".equals(locatorType.toLowerCase())) || ("css".equals(locatorType.toLowerCase()))) {
return By.cssSelector(locatorValue);
} else if ("xpath".equals(locatorType.toLowerCase())) {
return By.xpath(locatorValue);
} else {
return By.tagName(locatorValue);
}
}
讀取檔案操作方法
public GetByLocator(String filename) {
properties = new Properties();
try {
FileInputStream in = new FileInputStream((sysProperty.getProperty("user.dir") + "/comsevenday/src/main/resources/uiElement/" + filename));
this.properties.load(in);
in.close();
} catch (Exception e) {
logger.info("找不到檔案:" + filename);
e.printStackTrace();
}
}
撰寫元素存放位置:

內容為:
#\u70B9\u51FB\u9996\u9875
clickCart=xpath>>//android.view.View[@content-desc='\u9996\u9875']
撰寫測驗類
@Test
public void ss() throws IOException {
InputStream in = this.getClass().getResourceAsStream("/uielement/loginElement.properties");
Properties properties = new Properties();
properties.load(in);
String to_shop_text1 = properties.getProperty("clickCart");
System.out.println(to_shop_text1);
}
驗證結果:

元素等待查找工具類
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Reporter;
/**
* @author 7DGroup
* @Title: WaitUtil
* @Description: 等待查找元素工具類
* @date 2019/11/23 / 10:58
*/
public class WaitUtil {
public static void waitWebElement(AndroidDriver<AndroidElement> driver, By by, String name) {
LogUtil.info("等待元素出現-->目前操步驟為:" + name);
Reporter.log("目前操步驟為:" + name);
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(by));
}
}
元素定位類
package appout.appcase.data;
import appout.utils.GetByLocator;
import appout.utils.LogUtil;
import appout.utils.WaitUtil;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.Assert;
import java.util.List;
/**
* @author 7DGroup
* @Title: CartProvider
* @Description: this is
* @date 2019/11/23 / 10:57
*/
public class CartProvider {
private GetByLocator getByLocator;
private WebElement element = null;
/**
* 建構式
*/
public CartProvider() {
this.getByLocator = new GetByLocator("loginElement.properties");
}
/**
* 點擊首頁
*/
public void clickHome(AndroidDriver<AndroidElement> driver) {
WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "點擊首頁");
element = driver.findElement(getByLocator.getLocatorApp("clickCart"));
element.click();
}
/**
* 點擊百寶箱
*
* @param driver
*/
public void clickbaibao(AndroidDriver<AndroidElement> driver) {
WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "百寶箱");
String[] name = {"京東超市", "數碼電器", "京東服飾", "京東生鮮"};
for (int i = 0; i < name.length; i++) {
element = driver.findElement(getByLocator.getLocatorApp("Jingdong_supermarket".replace("京東超市", name[i])));
element.click();
//斷言
assertTrue(driver, "assertTitile", name[i] + "跳轉成功");
//退回
WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("home_back"), "退回");
driver.findElement(getByLocator.getLocatorApp("home_back"));
}
}
/**
* 分類寫法
*
* @param driver
*/
public void categorylist(AndroidDriver<AndroidElement> driver) {
WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("categorylist"), "遍歷分類");
//獲取全部資料挨個遍歷
List<AndroidElement> categorylist = driver.findElements(getByLocator.getLocatorApp("categorylist"));
for (int i = 0; i < categorylist.size(); i++) {
String text = categorylist.get(i).getText();
//輸出遍歷name
LogUtil.info(text);
categorylist.get(i).click();
}
}
/**
* 收藏
*
* @param driver
*/
public void productdetail(AndroidDriver<AndroidElement> driver) {
WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("productdetail"), "收藏");
AndroidElement detail = driver.findElement(getByLocator.getLocatorApp("productdetail"));
String attribute = detail.getAttribute("selected");
if (attribute.equals(true)) {
LogUtil.info("目前商品收藏,目前的屬性為:" + attribute);
} else {
LogUtil.info("商品沒有收藏,目前的屬性為:" + attribute);
}
}
/**
* 統一判斷是否通過
*
* @param driver 傳driver
* @param elemn 定元素
* @param des 描述
*/
public void assertTrue(AndroidDriver<AndroidElement> driver, String elemn, String des) {
WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp(elemn), des);
element = driver.findElement(getByLocator.getLocatorApp(elemn));
String text = element.getText();
if (text != null) {
Assert.assertTrue(true, des + "驗證成功");
} else {
//如果失敗系統會自動截圖
Assert.fail("跳轉失敗");
}
}
}
// Assert.assertTrue("", "驗證跳轉成功");
// driver.findElement(By.id(""))
基礎啟動類
package appout.appcase;
import appout.base.DriverBase;
import appout.utils.LogUtil;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import org.openqa.selenium.By;
import org.testng.Reporter;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.util.concurrent.TimeUnit;
/**
* @author 7DGroup
* @Title: LoginTest
* @Description: 用例區域
* @date 2019/11/21 / 10:06
*/
public class BestRuner {
static AndroidDriver<AndroidElement> driver;
public static AndroidDriver<AndroidElement> getDriver() {
return driver;
}
/**
* 初始化運行類
*
* @param udid
* @param port
* @throws Exception
*/
@BeforeClass
@Parameters({"udid", "port"})
public void BeforeClass(String udid, String port) {
Reporter.log("步驟1:啟動appium與應用", true);
LogUtil.info("---這是設備ID號-->" + udid);
LogUtil.info("--這是運行埠--->" + port);
//通過路徑獲取包名與APP_ACTIVITY
String apk = "com.jingdong.app.mall_70502.apk";
driver = DriverBase.initDriver(port, udid, apk, true);
driver.manage().timeouts().implicitlyWait(80, TimeUnit.SECONDS);
}
@Test(description = "初始化登錄啟動", testName = "進入首頁", priority = 0)
public void T001() {
LogUtil.info("啟動");
driver.findElement(By.id("com.jingdong.app.mall:id/mj")).click();
}
}
業務組合測驗類
package appout.appcase;
import appout.appcase.data.CartProvider;
import org.testng.annotations.Test;
/**
* @author 7DGroup
* @Title: CartTest
* @Description: 測驗類 extends BestRuner
* @date 2019/11/23 / 19:57
*/
public class CartTest {
CartProvider cartProvider = new CartProvider();
@Test(description = "點擊首頁百寶箱", testName = "點擊百寶箱", priority = 1)
public void T002() {
// cartProvider.clickHome(driver);
// cartProvider.clickbaibao(driver);
System.out.println("除錯");
}
}
其他測驗類集成,即可
總結
專案雖然小但包含了資料怎么存放,怎么獲取,怎么換回成 selenium 識別的型別,
本文原始碼:
- https://github.com/zuozewei/blog-example/tree/master/auto-test/comsevenday
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327966.html
標籤:其他
上一篇:JMeter模擬多用戶同時登錄,token傳遞介面關聯(同執行緒組)
下一篇:晶晨半導體---軟開
