/*
* Copyright 2002-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.suren.autotest.web.framework.log;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.imageio.ImageIO;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Point;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
import org.suren.autotest.web.framework.selenium.SeleniumEngine;
import org.suren.autotest.web.framework.util.AnimatedGifEncoder;
/**
* 添加搜索时的图片记录
* @author suren
* @date 2016年8月4日 上午8:13:56
*/
@Component
@Aspect
@Scope(value = "autotest", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Image4SearchLog
{
private static final Logger LOGGER = LoggerFactory.getLogger(Image4SearchLog.class);
@Autowired
private SeleniumEngine engine;
private Properties pro = new Properties();
private String progressIdentify;
private File outputDir;
private List<File> elementSearchImageFileList = new ArrayList<File>();
private AnimatedGifEncoder animatedGifEncoder;
public Image4SearchLog()
{
try
{
Enumeration<URL> urls = Image4SearchLog.class.getClassLoader().getResources(
LoggerConstants.IMG_LOG_CONF_FILE_NAME);
while(urls.hasMoreElements())
{
URL url = urls.nextElement();
try(InputStream imgCfgStream = url.openStream())
{
pro.load(imgCfgStream);
}
}
}
catch (IOException e)
{
LOGGER.error("Image4Search config file finding error.", e);
}
}
public File getOutputFile()
{
if(outputDir == null)
{
outputDir = new File(pro.getProperty(LoggerConstants.IMG_LOG_DIR, System.getProperty("java.io.tmpdir")));
if(!outputDir.isDirectory())
{
if(!outputDir.mkdirs())
{
LOGGER.error(String.format("Can not create img dir [%s].", outputDir));
outputDir = new File(System.getProperty("java.io.tmpdir"));
pro.setProperty(LoggerConstants.IMG_LOG_DIR, outputDir.getAbsolutePath());
}
}
}
return outputDir;
}
@PostConstruct
public void init()
{
outputDir = getOutputFile();
progressIdentify = (String) engine.getEngineConfig().get("progress_identify");
animatedGifEncoder = new AnimatedGifEncoder();
animatedGifEncoder.start(new File(outputDir, progressIdentify + ".gif").getAbsolutePath());
animatedGifEncoder.setDelay(800);
animatedGifEncoder.setRepeat(0);
}
@Around("execution(* org.suren.autotest.web.framework.core.ElementSearchStrategy.search*(..))")
public Object hello(ProceedingJoinPoint joinPoint) throws Throwable
{
Object[] args = joinPoint.getArgs();
Object res = joinPoint.proceed(args);
WebDriver driver = engine.getDriver();
if(res instanceof WebElement && driver instanceof TakesScreenshot)
{
TakesScreenshot shot = (TakesScreenshot) driver;
File file = shot.getScreenshotAs(OutputType.FILE);
BufferedImage bufImg = ImageIO.read(file);
try
{
WebElement webEle = (WebElement) res;
Point loc = webEle.getLocation();
Dimension size = webEle.getSize();
Graphics2D g = bufImg.createGraphics();
g.setColor(Color.red);
g.drawRect(loc.getX(), loc.getY(), size.getWidth(), size.getHeight());
}
catch(StaleElementReferenceException e)
{
//
}
File elementSearchImageFile = new File(outputDir, progressIdentify + "_" + System.currentTimeMillis() + ".png");
try(OutputStream output = new FileOutputStream(elementSearchImageFile))
{
ImageIO.write(bufImg, "gif", output);
elementSearchImageFileList.add(elementSearchImageFile);
animatedGifEncoder.addFrame(bufImg);
}
}
return res;
}
@PreDestroy
public void finish()
{
animatedGifEncoder.finish();
}
}