java selenium testng的一些历史踩坑记录.

    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()增加了异常处理,利用递归加计数器实现指定次数的方法重试.超出次数仍然失败则抛出异常.

经验分享 程序员 微信小程序 职场和发展