UI自动化框架总结

自动化框架

  • 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;
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容

  • 感谢原作者的奉献,原作者博客地址:http://blog.csdn.net/zhu_ai_xin_520/arti...
    狼孩阅读 13,944评论 1 35
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,068评论 1 32
  • 1. 自动化测试简介 1.1 什么是好的自动化测试框架 在创建测试自动化框架时,我们应该考虑以下要点: 能够通过使...
    小飞侠fayer阅读 14,143评论 6 17
  • 小培算是说话比较晚的孩子,2岁的时候只能叫爸爸妈妈外公外婆,从2岁零一个月开始会说的话渐渐增多,现在,2岁...
    肖肖月阅读 328评论 0 0
  • 他们相约再次去看樱花节,是在14年的五一。 五年后的樱花节,她独自去了旅顺,走在人山人海之中,看着路边开得争奇斗艳...
    有只兔子精阅读 104评论 0 4