pyqone 发表于 2019-4-11 09:16:40

对以前封装的selenium截图类的改进

自从从第一家公司离职后,就再也没有上过论坛了,一晃就是两年,今天登录,偶然间看到以前在这里发布的截图类工具的代码,感觉以前写的那个玩意也是很搞笑的,所以重新放上一个我改进后的截图类上来,烦请各位大神指点。
这一两年的时间里,我对截图类的改动并不大,除了重新修改了一下部分的方法名和删除了部分的重载方法以外,主要添加了以下功能:

[*]支持设置延迟截图时间,及设置了该参数以后,调用截图方法时会等待设置的时间后再进行截图,此举目的在于当我们调用截图时,由于程序运行较快,导致截图的时候可能还是界面在加载时的图像,达不到我们想要的目的
[*]支持逐时截图,即为截图单独开辟一条线程,根据设置的延迟截图时间来对界面进行实时截图
[*]支持等待某控件加载出现后再进行截图,但该方法还需要结合我另外的一个类,所以目前没法使用:loveliness:


大致上这段时间我对截图类的改动就这些,下面放上源码和jar包,望各位大神能给出改进的意见,小弟我也能继续完善截图这一个类,以更方便地进行测试,谢谢:loveliness::loveliness::loveliness::loveliness::loveliness:
package pres.auxiliary.selenium.tool;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;

import pres.auxiliary.directory.exception.IncorrectDirectoryException;
import pres.auxiliary.directory.exception.UndefinedDirectoryException;
import pres.auxiliary.directory.operate.MakeDirectory;
import pres.auxiliary.selenium.event.Event;

/**
* 该类用于在使用selenium进行自动化测试中进行截图的工具。使用该类时可以指定截图保存的位置以及
* 截图的名称,若不设置,则默认路径为C:\\AutoTest\\Screenshot\\,默认文件名称为Image。
* 在指定截图保存的位置和指定文件名称时,若指定的名称不合法,则会抛出异常
*
* @author 彭宇琦
* @version Ver1.1
*/
public class Screenshot {
        // 用于存储截图保存的路径
        private StringBuilder savePath = new StringBuilder("C:\\AutoTest\\Screenshot\\");
        // 用于存储截图的文件名称
        private StringBuilder imageName = new StringBuilder("Image");
        // 用于存储指定的WebDriver对象
        private WebDriver driver;
        // 用于存储截图的时间
        private long time = 500;

        /**
       * 用于按默认的方式创建截图保存位置及截图文件名称<br>
       * 默认位置为:C:/AutoTest/Screenshot/<br>
       * 默认文件名为(不带后缀):Image
       *
       * @param driver
       *            WebDriver对象
       */
        public Screenshot(WebDriver driver) {
                setDriver(driver);
        }

        /**
       * 用于按指定的路径以及默认的文件名保存截图<br/>
       * 默认文件名为(不带后缀):Image<br/>
       * 注意,传入的文件路径可为相对路径,也可为绝对路径,若路径不符合windows下文件夹名称的名称规则,
       * 则抛出IncorrectDirectoryException异常
       *
       * @param savePath
       *            指定的截图保存路径
       * @param driver
       *            WebDriver对象
       * @throws IncorrectDirectoryException
       *             传入路径不合法时抛出的异常
       */
        public Screenshot(WebDriver driver, String savePath) {
                setDriver(driver);
                setSavePath(savePath);
        }

        /**
       * 该方法用于返回截图的名称(不带后缀)
       *
       * @return 返回截图的名称(不带后缀)
       */
        public String getImageName() {
                return imageName.toString();
        }

        /**
       * 该方法用于设置截图的文件名称,若传入的文件名不符合windows下文件的命名规则, 则抛出IncorrectDirectoryException异常
       *
       * @param imageName
       *            指定的截图名称
       * @throws IncorrectDirectoryException
       *             文件命名不正确时抛出的异常
       */
        public void setImageName(String imageName) {
                // 判断传入的截图名称是否符合windows下的命名规则,若不符合,则抛出IncorrectDirectoryException异常
                if (!MakeDirectory.isFileName(imageName)) {
                        throw new IncorrectDirectoryException("不合理的文件名称,文件名称:" + imageName);
                }

                // 通过判断后,则清空imageName存储的信息并将新的文件名称放入imageName种属性中
                this.imageName.delete(0, this.imageName.length());
                this.imageName.append(imageName);
        }

        /**
       * 该方法用于返回截图保存的路径
       *
       * @return 返回截图保存的路径
       */
        public String getSavePath() {
                return savePath.toString();
        }

        /**
       * 该方法用于设置截图保存的位置,可传入相对路径,也可传入绝对路径,
       * 若传入的路径不符合windows下文件夹名称的命名规则时,则抛出IncorrectDirectoryException异常
       *
       * @param savePath
       *            传入的截图保存路径
       * @throws IncorrectDirectoryException
       *             传入路径不合法时抛出的异常
       */
        public void setSavePath(String savePath) {
                // 将传入的路径封装成StringBuilder,以便格式化
                StringBuilder sb = new StringBuilder(savePath);
                // 格式化传入的路径
                sb = MakeDirectory.formatPath(sb);

                // 判断传入的路径是否符合windows下对文件夹名称命名的规则,如果不符合则抛出IncorrectDirectoryException异常
                if (!MakeDirectory.isPath(sb.toString())) {
                        throw new IncorrectDirectoryException("不合理的文件夹路径,文件路径:" + sb.toString());
                }

                // 将通过判断的sb赋给savePath属性
                this.savePath = sb;
        }

        /**
       * 该方法用于返回指定的WebDriver对象
       *
       * @return 返回指定的WebDriver对象
       */
        public WebDriver getDriver() {
                return driver;
        }

        /**
       * 该方法用于设置WebDriver对象
       *
       * @param driver
       *            指定的WebDriver对象
       */
        public void setDriver(WebDriver driver) {
                this.driver = driver;
        }

        /**
       * 用于设置截图的等待时间
       *
       * @param time
       *            设置等待时间,单位为毫秒
       */
        public void setTime(long time) {
                this.time = time;
        }

        /**
       * 该方法用于创建截图并保存到相应的路径下,通过指定的截图文件名称和类中存储的WebDriver对象、截图保存路径来创建截图
       *
       * @param imageName
       *            指定的截图文件名
       * @throws IOException
       *             文件流状态不正确时抛出的异常
       * @throws WebDriverException
       *             WebDriver引用错误时抛出的异常
       * @throws NullPointerException
       *             WebDriver为空时抛出的异常
       * @throws UndefinedDirectoryException
       *             截图保存路径或截图名称为指定时抛出的异常
       * @see #creatImage()
       */
        public synchronized File creatImage(String imageName) throws WebDriverException, IOException {
                // 将名称放入属性中
                setImageName(imageName);
                // 调用无参方法
                return saveScreenshot();
        }
       
        /**
       * 用于逐时进行截图,其截图的时间间隔与等待时间有关系,可对截图等待时间进行设置{@link #setTime(long)}
       */
        public void ScreenshotToTime() {
                //开辟提条线程,让其独立于主线程运行
                new Thread(new Runnable() {
                        @Override
                        public void run() {
                                int i = 1;
                                while(true) {
                                        try {
                                                creatImage("截图" + (i++) + "_");
                                        } catch (WebDriverException e) {
                                                return;
                                        } catch (IOException e) {
                                                return;
                                        }
                                }
                        }
                }).start();
        }
       
        /**
       * 该方法用于创建截图并保存到相应的路径下,通过指定的截图文件名称和类中存储的WebDriver对象、截图保存路径来创建截图,
       * 该方法可先按照控件名称查找页面是否存在该控件,存在则截图,若不存在,则返回null
       *
       * @param event 事件类(Event)对象
       * @param controlName 控件名称
       * @param imageName 指定的截图文件名
       * @return
       * @throws IOException
       *             文件流状态不正确时抛出的异常
       * @throws WebDriverException
       *             WebDriver引用错误时抛出的异常
       * @throws NullPointerException
       *             WebDriver为空时抛出的异常
       * @throws UndefinedDirectoryException
       *             截图保存路径或截图名称为指定时抛出的异常
       * @see #creatImage(String)
       */
        public File creatImage(Event event, String controlName, String imageName) throws WebDriverException, IOException {
                //判断控件名对应的控件是否存在,存在后则截图,否则返回null
                if ( event.getJudgeEvent().judgeControl(controlName) ) {
                        return null;
                }
                // 将名称放入属性中
                setImageName(imageName);
                // 调用无参方法
                return saveScreenshot();
        }

        /**
       * 该方法用于保存并转移截图
       *
       * @throws IOException
       *             文件流状态不正确时抛出的异常
       * @throws WebDriverException
       *             WebDriver引用错误时抛出的异常
       */
        private File saveScreenshot() throws WebDriverException, IOException {
                // 判断driver对象是否为空,
                if (driver == null) {
                        throw new NullPointerException("无效的WebDriver对象");
                }

                // 判断截图保存路径和截图文件名是否存在,若不存在则抛出UndefinedDirectoryException异常
                if (savePath.toString().equals("") || imageName.toString().equals("")) {
                        throw new UndefinedDirectoryException(
                                        "未定义文件路径或者文件名,文件路径:" + savePath.toString() + ",文件名:" + imageName.toString());
                }
                               
                // 将savePath中保存的路径作为截图保存路径创建文件夹
                File f = new File(savePath.toString());
                f.mkdirs();

                // 在imageName的后面加上当前时间以及后缀名
                imageName.append(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
                imageName.append(".png");

                // 判断是否有设置截图等待时间,若设置了,则加上等待时间
                if (time != 0) {
                        try {
                                Thread.sleep(time);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }

                f = new File(f + "\\" + imageName.toString());

                // 截图,并将得到的截图转移到指定的目录下
                // 由于通过selenium的getScreenshotAs()得到的截图会不知道存储在哪,故需要通过文件流的方式将截图复制到指定的文件夹下
                FileUtils.copyFile(((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE), f);

                return f;
        }

        @Override
        public String toString() {
                return "savePath=" + savePath + "\r\nimageName=" + imageName + "\r\ndriver=" + driver;
        }

}

赵佳乐SMILE 发表于 2019-5-22 13:36:11

厉害

lllll4 发表于 2019-9-18 11:13:22

55555555555555

lllll4 发表于 2019-9-18 11:13:35

55555555555555555555555555555555555555555555555555555555:victory:

lllll4 发表于 2019-9-18 11:13:41

999999999999999999

lllll4 发表于 2019-9-18 11:13:47

6666666666666666666666

lllll4 发表于 2019-9-18 11:14:10

66666666666

lllll4 发表于 2019-9-18 11:14:24

9999999999999

pyqone 发表于 2019-9-23 09:42:51

lllll4 发表于 2019-9-18 11:14
9999999999999

:o请问是我哪写的不好吗

Miss_love 发表于 2020-12-25 14:04:09

感谢分享哟

花岗岩大炮 发表于 2023-4-13 17:06:55

666
页: [1]
查看完整版本: 对以前封装的selenium截图类的改进