Goldsking

博客园 首页 新随笔 联系 订阅 管理

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 (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 by
 5      *            页面元素
6 * @return 页面元素 7 */ 8 public WebElement getElement(By by) { 9 return getElement(by, 5); 10 }

 

posted on 2015-01-28 16:55  蜀道难Wx  阅读(513)  评论(0编辑  收藏  举报