Appium自动化中截图的问题

时间:2024-11-18 00:07:31

在用Appium做UI自动化过程中,大家会发现测试报告很重要,而在测试报告中截图很重要。

因为很多公司都是用Jenkins作为持续集成工具,所以要让执行自动化测试的人看明白自动化在跑什么,哪里失败了,关键节点都需要截图。

怎么做呢,目前项目中是这么实现的:

1.实现截图功能类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static String screenShot(ShipperAndroidEmulator ae) {
    String dir = "screenshot"// TODO
    String time = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date());
    String screenShotPath = dir + File.separator + time + ".png";
    AndroidDriver augmentedDriver = null;
    augmentedDriver = ae.getAndroid();
    try {
        File sourceFile = ((TakesScreenshot) augmentedDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(sourceFile, new File(screenShotPath));
    catch (Exception e) {
        e.printStackTrace();
        return "Failed to screenshot";
    }
    return screenShotPath.replace("\\""/");
}

2.用screenShot实现错误处理类:

1
2
3
4
5
6
7
8
9
10
private void handleFailure(String notice) {
    String png = LogTools.screenShot(this);
    String log = notice + " >> capture screenshot at " + png;
    logger.error(log);
    if (GlobalSettings.baseStorageUrl.lastIndexOf("/") == GlobalSettings.baseStorageUrl.length()) {
        GlobalSettings.baseStorageUrl = GlobalSettings.baseStorageUrl.substring(0, GlobalSettings.baseStorageUrl.length() - 1);
    }
    Reporter.log(log + "<br/><img src=\"" + GlobalSettings.baseStorageUrl + "/" + png + "\" />");
    Assert.fail(log);
}

3.对所有appium界面操作类进行处理:

1
2
3
4
5
6
7
8
9
10
11
12
public void click(By by) {
    expectElementExistOrNot(true, by, timeout);
    try{
        clickTheClickable(by,System.currentTimeMillis(),2500);
        handleSuccess("Succeed to click " + by);
    }catch(Exception e){
        e.printStackTrace();
        handleFailure("Failed to click " + by);
    }
    logger.info("Clicked " + by);
}

4. 不能点击时候重试点击操作

private void clickTheClickable(By byElement, long startTime, int timeOut) throws Exception {
try {
findElementBy(byElement).click();
} catch (Exception e) {
if (System.currentTimeMillis() - startTime > timeOut) {
logger.warn(byElement+ " is unclickable");
throw new Exception(e);
} else {
Thread.sleep(500);
logger.warn(byElement + " is unclickable, try again");
clickTheClickable(byElement, startTime, timeOut);
}
}