51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3999|回复: 10
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    慵懒
    2021-3-13 18:26
  • 签到天数: 129 天

    连续签到: 1 天

    [LV.7]测试师长

    跳转到指定楼层
    1#
    发表于 2019-4-11 09:16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    自从从第一家公司离职后,就再也没有上过论坛了,一晃就是两年,今天登录,偶然间看到以前在这里发布的截图类工具的代码,感觉以前写的那个玩意也是很搞笑的,所以重新放上一个我改进后的截图类上来,烦请各位大神指点。
    这一两年的时间里,我对截图类的改动并不大,除了重新修改了一下部分的方法名和删除了部分的重载方法以外,主要添加了以下功能:
    • 支持设置延迟截图时间,及设置了该参数以后,调用截图方法时会等待设置的时间后再进行截图,此举目的在于当我们调用截图时,由于程序运行较快,导致截图的时候可能还是界面在加载时的图像,达不到我们想要的目的
    • 支持逐时截图,即为截图单独开辟一条线程,根据设置的延迟截图时间来对界面进行实时截图
    • 支持等待某控件加载出现后再进行截图,但该方法还需要结合我另外的一个类,所以目前没法使用


    大致上这段时间我对截图类的改动就这些,下面放上源码和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. }
    复制代码


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-9-18 11:03
  • 签到天数: 7 天

    连续签到: 3 天

    [LV.3]测试连长

    3#
    发表于 2019-9-18 11:13:22 | 只看该作者
    55555555555555
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-9-18 11:03
  • 签到天数: 7 天

    连续签到: 3 天

    [LV.3]测试连长

    4#
    发表于 2019-9-18 11:13:35 | 只看该作者
    55555555555555555555555555555555555555555555555555555555
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-9-18 11:03
  • 签到天数: 7 天

    连续签到: 3 天

    [LV.3]测试连长

    5#
    发表于 2019-9-18 11:13:41 | 只看该作者
    999999999999999999
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-9-18 11:03
  • 签到天数: 7 天

    连续签到: 3 天

    [LV.3]测试连长

    6#
    发表于 2019-9-18 11:13:47 | 只看该作者
    6666666666666666666666
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-9-18 11:03
  • 签到天数: 7 天

    连续签到: 3 天

    [LV.3]测试连长

    7#
    发表于 2019-9-18 11:14:10 | 只看该作者
    66666666666
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-9-18 11:03
  • 签到天数: 7 天

    连续签到: 3 天

    [LV.3]测试连长

    8#
    发表于 2019-9-18 11:14:24 | 只看该作者
    9999999999999
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-3-13 18:26
  • 签到天数: 129 天

    连续签到: 1 天

    [LV.7]测试师长

    9#
     楼主| 发表于 2019-9-23 09:42:51 | 只看该作者

    请问是我哪写的不好吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-31 08:59
  • 签到天数: 975 天

    连续签到: 1 天

    [LV.10]测试总司令

    10#
    发表于 2020-12-25 14:04:09 | 只看该作者
    感谢分享哟
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-24 21:40 , Processed in 0.077092 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表