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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Franciz小测测

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值