51Testing软件测试论坛

标题: 对以前封装的selenium截图类的改进 [打印本页]

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


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

  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;

  6. import org.apache.commons.io.FileUtils;
  7. import org.openqa.selenium.OutputType;
  8. import org.openqa.selenium.TakesScreenshot;
  9. import org.openqa.selenium.WebDriver;
  10. import org.openqa.selenium.WebDriverException;

  11. import pres.auxiliary.directory.exception.IncorrectDirectoryException;
  12. import pres.auxiliary.directory.exception.UndefinedDirectoryException;
  13. import pres.auxiliary.directory.operate.MakeDirectory;
  14. import pres.auxiliary.selenium.event.Event;

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

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

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

  60.         /**
  61.          * 该方法用于返回截图的名称(不带后缀)
  62.          *
  63.          * @return 返回截图的名称(不带后缀)
  64.          */
  65.         public String getImageName() {
  66.                 return imageName.toString();
  67.         }

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

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

  85.         /**
  86.          * 该方法用于返回截图保存的路径
  87.          *
  88.          * @return 返回截图保存的路径
  89.          */
  90.         public String getSavePath() {
  91.                 return savePath.toString();
  92.         }

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

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

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

  114.         /**
  115.          * 该方法用于返回指定的WebDriver对象
  116.          *
  117.          * @return 返回指定的WebDriver对象
  118.          */
  119.         public WebDriver getDriver() {
  120.                 return driver;
  121.         }

  122.         /**
  123.          * 该方法用于设置WebDriver对象
  124.          *
  125.          * @param driver
  126.          *            指定的WebDriver对象
  127.          */
  128.         public void setDriver(WebDriver driver) {
  129.                 this.driver = driver;
  130.         }

  131.         /**
  132.          * 用于设置截图的等待时间
  133.          *
  134.          * @param time
  135.          *            设置等待时间,单位为毫秒
  136.          */
  137.         public void setTime(long time) {
  138.                 this.time = time;
  139.         }

  140.         /**
  141.          * 该方法用于创建截图并保存到相应的路径下,通过指定的截图文件名称和类中存储的WebDriver对象、截图保存路径来创建截图
  142.          *
  143.          * @param imageName
  144.          *            指定的截图文件名
  145.          * @throws IOException
  146.          *             文件流状态不正确时抛出的异常
  147.          * @throws WebDriverException
  148.          *             WebDriver引用错误时抛出的异常
  149.          * @throws NullPointerException
  150.          *             WebDriver为空时抛出的异常
  151.          * @throws UndefinedDirectoryException
  152.          *             截图保存路径或截图名称为指定时抛出的异常
  153.          * @see #creatImage()
  154.          */
  155.         public synchronized File creatImage(String imageName) throws WebDriverException, IOException {
  156.                 // 将名称放入属性中
  157.                 setImageName(imageName);
  158.                 // 调用无参方法
  159.                 return saveScreenshot();
  160.         }
  161.        
  162.         /**
  163.          * 用于逐时进行截图,其截图的时间间隔与等待时间有关系,可对截图等待时间进行设置{@link #setTime(long)}
  164.          */
  165.         public void ScreenshotToTime() {
  166.                 //开辟提条线程,让其独立于主线程运行
  167.                 new Thread(new Runnable() {
  168.                         @Override
  169.                         public void run() {
  170.                                 int i = 1;
  171.                                 while(true) {
  172.                                         try {
  173.                                                 creatImage("截图" + (i++) + "_");
  174.                                         } catch (WebDriverException e) {
  175.                                                 return;
  176.                                         } catch (IOException e) {
  177.                                                 return;
  178.                                         }
  179.                                 }
  180.                         }
  181.                 }).start();
  182.         }
  183.        
  184.         /**
  185.          * 该方法用于创建截图并保存到相应的路径下,通过指定的截图文件名称和类中存储的WebDriver对象、截图保存路径来创建截图,
  186.          * 该方法可先按照控件名称查找页面是否存在该控件,存在则截图,若不存在,则返回null
  187.          *
  188.          * @param event 事件类(Event)对象
  189.          * @param controlName 控件名称
  190.          * @param imageName 指定的截图文件名
  191.          * @return
  192.          * @throws IOException
  193.          *             文件流状态不正确时抛出的异常
  194.          * @throws WebDriverException
  195.          *             WebDriver引用错误时抛出的异常
  196.          * @throws NullPointerException
  197.          *             WebDriver为空时抛出的异常
  198.          * @throws UndefinedDirectoryException
  199.          *             截图保存路径或截图名称为指定时抛出的异常
  200.          * @see #creatImage(String)
  201.          */
  202.         public File creatImage(Event event, String controlName, String imageName) throws WebDriverException, IOException {
  203.                 //判断控件名对应的控件是否存在,存在后则截图,否则返回null
  204.                 if ( event.getJudgeEvent().judgeControl(controlName) ) {
  205.                         return null;
  206.                 }
  207.                 // 将名称放入属性中
  208.                 setImageName(imageName);
  209.                 // 调用无参方法
  210.                 return saveScreenshot();
  211.         }

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

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

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

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

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

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

  249.                 return f;
  250.         }

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

  255. }
复制代码



作者: 赵佳乐SMILE    时间: 2019-5-22 13:36
厉害
作者: lllll4    时间: 2019-9-18 11:13
55555555555555
作者: lllll4    时间: 2019-9-18 11:13
55555555555555555555555555555555555555555555555555555555
作者: lllll4    时间: 2019-9-18 11:13
999999999999999999
作者: lllll4    时间: 2019-9-18 11:13
6666666666666666666666
作者: lllll4    时间: 2019-9-18 11:14
66666666666
作者: lllll4    时间: 2019-9-18 11:14
9999999999999
作者: pyqone    时间: 2019-9-23 09:42
lllll4 发表于 2019-9-18 11:14
9999999999999

请问是我哪写的不好吗
作者: Miss_love    时间: 2020-12-25 14:04
感谢分享哟
作者: 花岗岩大炮    时间: 2023-4-13 17:06
666




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2