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 timeout 10 * 超时时间 11 * @return 页面元素 12 */ 13 public WebElement getElement(By by) { 14 return getElement(by, 5); 15 }
时间: 2024-11-08 10:17:05