0
点赞
收藏
分享

微信扫一扫

自动化工具之Appium框架之数据驱动

背景

        自动化是为业务测试服务,如果数据与业务放在一起看起来不是很规整与整洁,是否可以把数据与业务分离,是完全可以的,这也是市场常见的数据驱动框架,今天咱们就聊一聊怎么搭建自己数据驱动框架;

       

前置条件

      appium环境搭建成功,不会参考自动化工具之Appium工具简单介绍,实在不会在参考网上怎么搭建。

思考

       UI自动化框架元素放文本存储、数据存储、代码直接存储等其实随便那个都行,只有自己用者方便就行,我工作中用文本文件存储,这样修改方便,脚本放svn/git管理就行,ui自动元素操作基本常见的就是ID/NAME/XPATH等这几种,咱们写一个工具转换类即可。


元素读取工具类  

参考代码


1.  /**
2.      * 移动端元素定位
3.      *
4.      * @return
5.      * @param: name 获取元素对象
6.      */
7.     public By getLocatorApp(String name) {
8.         String locator = properties.getProperty(name.trim());
9.         String locatorType = locator.split(">>")[0].toLowerCase();
10.         String locatorValue = locator.split(">>")[1];
11.         if (locatorType != null && locatorType != null) {
12.             logger.info("获取元素key: " + name + "\t 获取的定位类型:" + locatorType + "\t 获取的定位表达式: " + locatorValue);
13.             // 根据 locatorType 的变量值内容判断,返回何种定位方式的 By 对象
14.             return getkeyVule(locatorType, locatorValue);
15.         } else {
16.             new RuntimeException("元素没有获取到!");
17.             return null;
18.         }
19.     }
20. 
21.  /**
22.      * 读取元素
23.      * @param locatorType
24.      * @param locatorValue
25.      * @return By
26.      */
27.     public By getkeyVule(String locatorType, String locatorValue) {
28.         if ("id".equals(locatorType.toLowerCase())) {
29.             return By.id(locatorValue);
30.         } else if ("name".equals(locatorType.toLowerCase())) {
31.             return By.name(locatorValue);
32.         } else if (("classname".equals(locatorType.toLowerCase())) || ("class".equals(locatorType.toLowerCase()))) {
33.             return By.className(locatorValue);
34.         } else if (("tagname".equals(locatorType.toLowerCase())) || ("tag".equals(locatorType.toLowerCase()))) {
35.             return By.className(locatorValue);
36.         } else if (("linktext".equals(locatorType.toLowerCase())) || ("link".equals(locatorType.toLowerCase()))) {
37.             return By.linkText(locatorValue);
38.         } else if ("partiallinktext".equals(locatorType.toLowerCase())) {
39.             return By.partialLinkText(locatorValue);
40.         } else if (("cssselector".equals(locatorType.toLowerCase())) || ("css".equals(locatorType.toLowerCase()))) {
41.             return By.cssSelector(locatorValue);
42.         } else if ("xpath".equals(locatorType.toLowerCase())) {
43.             return By.xpath(locatorValue);
44.         } else {
45.             return By.tagName(locatorValue);
46.         }
47.     }

读取文件操作方法


1.  private Properties properties = null;
2.     static Properties sysProperty = System.getProperties();
3. 
4.     public GetByLocator() {
5.     }
6. 
7.     public GetByLocator(String filename) {
8.         properties = new Properties();
9.         try {
10.             FileInputStream in = new FileInputStream((sysProperty.getProperty("user.dir") + "/src/main/resources/uiElement/" + filename));
11.             this.properties.load(in);
12.             in.close();
13.         } catch (Exception e) {
14.             logger.info("找不到文件:" + filename);
15.             e.printStackTrace();
16.         }
17.     }

编写元素存放位置:

自动化工具之Appium框架之数据驱动_ide

内容为:

#点击我的
clickCart=xpath>>//android.widget.ImageView[@content-desc='我的']

编写测试类

自动化工具之Appium框架之数据驱动_ide_02

验证结果:

自动化工具之Appium框架之数据驱动_android_03

元素等待查找工具类


1. import io.appium.java_client.android.AndroidDriver;
2. import io.appium.java_client.android.AndroidElement;
3. import org.openqa.selenium.By;
4. import org.openqa.selenium.support.ui.ExpectedConditions;
5. import org.openqa.selenium.support.ui.WebDriverWait;
6. import org.testng.Reporter;
7. 
8. /**
9.  * @author liwen
10.  * @Title: WaitUtil
11.  * @Description: 等待查找元素工具类
12.  * @date 2019/11/23 / 10:58
13.  */
14. public class WaitUtil {
15. 
16.     public static void waitWebElement(AndroidDriver<AndroidElement> driver, By by, String name) {
17.         LogUtil.info("等待元素出现-->目前操步骤为:" + name);
18.         Reporter.log("目前操步骤为:" + name);
19.         WebDriverWait wait = new WebDriverWait(driver, 10);
20.         wait.until(ExpectedConditions.presenceOfElementLocated(by));
21.     }
22. }

元素定位类


1. import com.thappium.util.GetByLocator;
2. import com.thappium.util.WaitUtil;
3. import io.appium.java_client.android.AndroidDriver;
4. import io.appium.java_client.android.AndroidElement;
5. import org.openqa.selenium.WebElement;
6. 
7. /**
8.  * @author liwen
9.  * @Title: CartProvider
10.  * @Description: 购物车测试类
11.  * @date 2019/11/23 / 15:12
12.  */
13. public class CartProvider {
14. 
15.     private GetByLocator getByLocator;
16.     private WebElement element = null;
17. 
18.     /**
19.      * 构造函数
20.      */
21.     public CartProvider() {
22.         this.getByLocator = new GetByLocator("loginElement.properties");
23.     }
24. 
25.     /**
26.      * 点击购物车
27.      */
28.     public void clickCart(AndroidDriver<AndroidElement> driver) {
29.         WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "点击购物车");
30.         element = driver.findElement(getByLocator.getLocatorApp("clickCart"));
31.         element.click();
32.     }
33. }

基础启动类,其他测试类集成,即可


1. /**
2.  * @author liwen
3.  * @Title: BestRuner
4.  * @Description:
5.  * @date 2019/11/23 / 10:07
6.  */
7. @Log4j
8. public class BestRuner {
9.   public static AndroidDriver<AndroidElement> getDriver() {
10.     return driver;
11. }
12. 
13.      static AndroidDriver<AndroidElement> driver;
14. 
15.     /**
16.      * 初始化运行类
17.      *
18.      * @param udid
19.      * @param port
20.      * @throws Exception
21.      */
22.     @BeforeClass
23.     @Parameters({"udid", "port"})
24.     public void BeforeClass(String udid, String port) {
25.         Reporter.log("步骤1:启动appium与应用", true);
26.         LogUtil.info("---这是设备ID号-->" + udid);
27.         LogUtil.info("--这是运行端口--->" + port);
28.         //通过路径获取包名与APP_ACTIVITY
29.         String apk = "pinduoduov4.76.0_downcc.com.apk";
30.         driver = DriverBase.initDriver(port, udid, apk, true);
31.         driver.manage().timeouts().implicitlyWait(80, TimeUnit.SECONDS);
32.     }
33. 
34. }

业务组合测试类


1. /**
2.  * @author liwen
3.  * @Title: CartTest
4.  * @Description:  测试类
5.  * @date 2019/11/23 / 11:26
6.  */
7. public class CartTest extends BestRuner {
8. 
9.     CartProvider car = new CartProvider();
10. 
11.     /**
12.      * 点击购物车
13.      */
14.     @Test(description = "点击购物车", testName = "购物车模块Dome")
15.     public void getopent() {
16.         car.clickCart(driver);
17.         
18.     }
19. 
20. }

源码位置:

https://github.com/357712148/bodygit.git

自动化工具之Appium框架之数据驱动_测试类_04


总结

       项目虽然小但包含了数据怎么存放,怎么获取,怎么换回成selenium识别的类型。



自动化工具之Appium框架之数据驱动_ide_05


举报

相关推荐

0 条评论