java selenium testng的一些踩坑记录.

    科技2022-07-14  124

    2020-11-23 更新

    遇到突然大部分/全部脚本报错时,先检查网络问题.其次检查驱动和浏览版本(谷歌浏览器会自动升级的).

    自定义跳过异常–>测试过程触发此异常会将Testng测试结果标记为跳过. 示例 /** * 随机点击列表中的数据 * * @param clickedElementName * @param elementList */ public void callListAndClickByRandomIndex(String clickedElementName, String elementList) { callList(clickedElementName); try { int in_num = getRandomIndexByElementsSize(elementList); clickByIndex(elementList, in_num); } catch (Exception e) { logger.error("元素\"" + elementList + "\"报错或缺少对应依赖数据;" + e); throw new SkipException("元素\"" + elementList + "\"报错或缺少对应依赖数据;" + e); } }

    说明:这段代码旨在处理随机点击下拉框中的选择项.然后在加跳过异常处理.

    处理测试启动浏览器的时候,遇例如到断网情况.避免反复加载浏览器驱动/增加失败重试. @BeforeSuite protected void beforeSuite() { try { setDriverAndLoginEman(); } catch (Exception e) { driver.quit(); int count = anCountFailedTimes(); // count > 1 等于实际运行2次,套件之初登录失败后尝试重新登录 if (count > 2) { //用完重置递归计数器 reAnCountFailedTimes(); throw new RuntimeException("尝试了" + count + "次之后,打开浏览器报错!" + e); } else { pause(2000); beforeSuite(); } } logger.info("----测试类"+this.getClass().getName()+"开始测试,打开浏览器----"); //上面没有报错的时候就标记为true,BeforeClass识别到true之后就不在打开浏览器,然后设置为false setLabelBeforeClassIsStarted(true); } private void setDriverAndLoginEman() { driver = WebDriverUtils.getChromeDriver(); driver.manage().window().maximize(); loginEman(); } @BeforeClass protected void beforeClass() { if (!getLabelBeforeClassIsStarted()) { logger.info("----测试类"+this.getClass().getName()+"开始测试,打开浏览器----"); setDriverAndLoginEman(); } //识别到beforeSuite设置为true时不打开浏览器然后设置为false旨在beforeSuite正常执行后和beforeClass不执行 setLabelBeforeClassIsStarted(false); pause(2000); }

    我的需求是每次beforeclass启动浏览器afterclass关闭浏览器. 这段代码旨在解决UI自动化测试启动的时候遇到问题比如断网,无法启动.但是beforeClass会忽略错误继续被下一个测试类调用进而启动多个浏览器.

    思路是只要正确执行了beforeSuite()则beforeClass()在此次执行中不在重复执行(因为两者都有启动浏览器的操作然后在第一次beforeClass()代码执行后将执行条件设置为setLabelBeforeClassIsStarted(false);第二次开始正常实现我的需求).在beforeSuite()增加了异常处理,利用递归加计数器实现指定次数的方法重试.超出次数仍然失败则抛出异常.

    Processed: 0.015, SQL: 8