美文网首页
UI自动化框架总结

UI自动化框架总结

作者: Loistein | 来源:发表于2019-06-27 13:09 被阅读0次

自动化框架

  • Base基类:启动、关闭浏览器,定义DataProvider()数据驱动
  • 页面:页面元素单独定义,使用xpath、css、js等
  • 操作:具有业务意义的操作独立封装
  • 案例:按业务需求调用操作
  • 工具包:数据库操作封装、读取Excel、字符串处理等
  • 监听器
  • 截图机制:
    截图时间点:重写TestListenerAdapter接口中的onTestFailure、onTestSkipped方法;
    (注:TestListenerAdapter实际实现的是 ITestListener,直接实现 ITestListener也可以)
    截图方法:
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
filePath = "result/test-report/screenshot/"+ fileName + ".jpg";
  • 重试机制:重写TestNG IRetryAnalyzer接口retry方法。重写IAnnotationTransformer接口transform方法检查是否有getRetryAnalyzer,如果没有,定义为自定义的analyzer。
    (注:IAnnotationTransformer用来修改@test注解,IAnnotationTransformer2用来修改@DataProvider, @Factory 以及 @Configuration)

  • 报告部分:重写TestNG IReporter接口generateReport方法,testng.xml文件中配置listener

UI自动化之图像对比

package UITest;

import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageCompare {
    public static Boolean imageCompare() {
    File fileInput = new File("D:\\2.png");
    File fileOutput = new File("D:\\1.png");
    try {
        BufferedImage bufferInput = ImageIO.read(fileInput);
        BufferedImage bufferOutput = ImageIO.read(fileOutput);
        
        DataBuffer dafileInput= bufferInput.getData().getDataBuffer();
        DataBuffer dafileOutput= bufferOutput.getData().getDataBuffer();
        
        int sizeFileInput = dafileInput.getSize();
        int sizeFileOutput = dafileOutput.getSize();
        
        Boolean matchFlag = false;
        
        if(sizeFileInput == sizeFileOutput) {
            for(int i = 0; i < sizeFileInput; i ++) {
                if(dafileInput.getElem(i) != dafileOutput.getElem(i)) {
                    matchFlag = false;
                    break;
                }
            }
             matchFlag = true;
        }       
        return matchFlag;       
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;   
    }   
    public static void main(String args[]) {
        System.out.println(imageCompare());
    }
}

UI自动化截图

File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.***FILE***);
public class TestResultListener extends TestListenerAdapter {

    private static Logger logger = Logger.getLogger(TestResultListener.class.getName());
    protected ITestContext testContext = null; 
    String  browser = null;

    @Override
    public void onStart(ITestContext testContext) { 
        this.testContext = testContext;
        browser = String.valueOf(testContext.getCurrentXmlTest().getParameter("browserName"));
        super.onStart(testContext);
    }

    @Override
    public void onTestFailure(ITestResult tr) {
        super.onTestFailure(tr);
        WebDriver webDriver = (WebDriver) testContext.getAttribute("SELENIUM_DRIVER"); 
        saveScreenShot(tr, webDriver,browser);
    }

    @Override
    public void onTestSkipped(ITestResult tr) {
        super.onTestSkipped(tr);
        WebDriver webDriver = (WebDriver) testContext.getAttribute("SELENIUM_DRIVER");
        saveScreenShot(tr, webDriver,browser);

    }

失败用例重新运行

public class TestngRetry implements IRetryAnalyzer {
    static {
        LogConfiguration.initLog("TestngRetryPage_");
    }
    private static Logger logger = Logger.getLogger(TestngRetry.class);
    private int retryCount = 1;
    private static int maxRetryCount;

    static {
        ConfigReader config = ConfigReader.getInstance();
        maxRetryCount = config.getRetryCount();
        logger.info("RetryCount=" + maxRetryCount);
        logger.info("SourceDir=" + config.getSourceCodeDir());
        logger.info("SourceEncoding=" + config.getSrouceCodeEncoding());
    }

    public boolean retry(ITestResult result) {
        if (retryCount <= maxRetryCount) {
            String message = "Retry for: [" + result.getName() + "] on class [" + result.getTestClass().getName() + "] retry " + retryCount + " times";
            logger.info(message);
            Reporter.setCurrentTestResult(result);
            Reporter.log("RunCount=" + (retryCount + 1));
            retryCount++;
            return true;
        }
        return false;
    }

相关文章

  • 一、Macaca环境配置mobile

    一、UI 自动化框架调研总结 下方的链接内,对现在可用的UI自动化测试框架的利与弊进行了多方面的分析,受益匪浅 h...

  • 5.3自动化测试框架

    5.3.1接口自动化测试框架 5.3.2 UI自动化测试框架

  • 2019-04-03

    # appuim分享 ## 自动化测试工具比较 ### 1、有哪些可用的UI自动化框架 ![自动化框架](http...

  • 自动化测试的建设与应用

    一、从UI自动化到接口自动化 1、UI自动化 框架:appium+airtest 模式:PO模式——用来管理维护一...

  • UI自动化框架总结

    自动化框架 Base基类:启动、关闭浏览器,定义DataProvider()数据驱动 页面:页面元素单独定义,使用...

  • selenium2学习

    自动化介绍:UI自动化测试 Selenium简介:测试web应用程序用户界面(ui)的常用框架pip instal...

  • UI 自动化编写规范 (基于 Airtest)

    一、前言 说起UI自动化测试,尤其是移动端UI自动化,测试框架和技术层出不穷。经过多框架对比后,最终选择了AirT...

  • HttpRunner二次开发UI自动化框架

    基于HttpRunner接口自动化开源框架二次开发,下阶段更新UI自动化平台前端页面 Ui自动化应具备哪些功能呢?...

  • python下appium服务的自启动和关闭

    最近想把前不久写的webUi框架改写成mobile_Ui,也就是 用于手机端的UI自动化框架,目前已经完成该框架的...

  • 通用的UI自动化测试框架(2)----常用公共函数封装

    介绍 在上一篇文章链接?里我们讲了如何设计通用的UI自动化测试框架,这篇文章我会举几个例子,在UI自动化框架里,如...

网友评论

      本文标题:UI自动化框架总结

      本文链接:https://www.haomeiwen.com/subject/wfolcctx.html