首页 > 代码库 > 基于页面元素定位的操作失败自动截图

基于页面元素定位的操作失败自动截图

web自动化脚本运行失败,很大一部分问题出在元素定位上,博主在这里介绍一个循环定位及失败截图的方法。以方便脚本维护,定位问题。

1、以下代码是WebDriver自带的方法,封装一下,使用即可。

 1     /** 2      * 截取屏幕截图并保存到指定路径 3      *  4      * @param filepath 5      *            保存屏幕截图完整文件名称及路径 6      * @return 7      */ 8     public void captureScreenshot(String filepath) { 9         File screenShotFile = ((TakesScreenshot) driver)10                 .getScreenshotAs(OutputType.FILE);11         try {12             FileUtils.copyFile(screenShotFile, new File(filepath));13         } catch (Exception e) {14             e.printStackTrace();15         }16     }                    

2、截图公共方法,生成存放路径和文件名,打印失败信息

    /**     * 截图公共方法,生成存放路径和文件名,打印失败信息     *      * @param isSucceed     *            if your operation success     */    public void operationCheck(String methodName, boolean isSucceed)            throws Exception {        if (!isSucceed) {            Date date = new Date();            DateFormat format = new SimpleDateFormat("yyyy-MM-dd HHmmss");            String time = format.format(date);            StringBuffer sb = new StringBuffer();            String captureName = sb.append("./Captures/")                    .append(methodName).append(time).append(".png").toString();            captureScreenshot(captureName);            System.out.println("method 【" + methodName + "】 运行失败,请查看截图快照:" + captureName);        }    }

3、在指定的超时时间内,循环定位页面元素,成功则随时返回true,超时时间内没有定位到元素,则执行截图方法,返回false

 1     /** 2      * wait for the specified element appears with timeout setting. 3      *  4      * @param locator 5      *            the element locator on the page 6      * @param timeout 7      *            超时时间,单位:秒 8      */ 9     public boolean isElementPresent(By locator, long timeout) throws Exception {10         boolean isSucceed = false;11         long timeBegins = System.currentTimeMillis();12         do {13             try {14                 driver.findElement(locator);15                 isSucceed = true;16                 break;17             } catch (Exception e) {18                 e.printStackTrace();19             }20 21         } while (System.currentTimeMillis() - timeBegins <= timeout * 1000);22 23         operationCheck("isElementPresent", isSucceed);24         return isSucceed;25     }

4、定位页面元素公共方法,每次定位元素都调用isElementPresent方法。解决元素未加载完成就点击的问题。

 1     /** 2      * 定位页面元素,超时时间内反复判断元素是否出现。若元素定位失败,则截图 3      *  4      * @param by 5      *            页面元素 6      * @param timeout 7      *            超时时间 8      * @return 页面元素 9      */10     public WebElement getElement(By by, long timeout) {11         try {12             if (opr.isElementPresent(by, timeout)) {                13                 return driver.findElement(by);14             }15         } catch (Exception e) {16             System.out.println(e + "");17         }18         return null;19     }

5、默认超时时间5秒,脚本使用时直接调用getElement(By by)即可

 1     /** 2      * 定位页面元素,超时时间内反复判断元素是否出现。若元素定位失败,则截图 3      *  4      * @param obj 5      *            父对象 6      *  7      * @param by 8      *            页面元素 9      * @param timeout10      *            超时时间11      * @return 页面元素12      */13     public WebElement getElement(By by) {14         return getElement(by, 5);15     }

 

基于页面元素定位的操作失败自动截图