Webuitest4j Save

该项目是 java 编写的使用 selenium 依赖包的 WebUI 测试项目

Project README

[TOC]

English | 博客

注意:此项目在不断的优化和拓展中,因此 readme 没有及时的更新!项目经过实战,此 readme 不是最新的项目样貌,仅仅是初代版的样子!但是此 readme 对于理解框架还是很有帮助的!后面会更新 readme!

简介

该项目是 java 编写的使用 selenium 依赖包的 WebUI 测试项目

java + selenium + testng + maven + PO + 多线程 + slf4j + log4j + 截图 + extentreports + redis + 多浏览器 + h5 + 优先级设置 + jenkins + grid 平台

框架功能

  • PO 思想模式
  • 多线程
  • slf4j + log4j 日志
  • 出错截图
  • extentreports 等多种测试报告
  • redis 存取值
  • 多种浏览器支持测试
  • 谷歌 h5 测试支持
  • 调整了优先级
  • 支持 jenkins job 传参构建
  • 支持运行 hub 的浏览器节点

使用介绍

将 github 项目拉取到本之后,可以运行本地 testng.xml,或者运行 pom 文件,mvn test 控制台运行也是可行的,本地最好安装一下 redis 服务,没有也可以正常运行,对测试流程和报告产出没有影响,但控制台会显示 redis 连接有问题。

编写时候在关注页面操作,PO 对象拆分成了数据,元素定位和页面操作三个部分放在三个包中,PO 对象需要继承 BasePage,PO 对象写完之后,直接编写测试用例,测试用例会继承 BaseTest,测试用例调用 PO 的操作方法实现测试流程,将测试用例组织到 testng.xml 中实现,最后可以使用 jenkins 来持续构建

关系结构

1580447619807

  • base 包

    有 BaseTest 测试基类,BaseDriver 驱动基类,在 BaseTest 中主要使用到了 BaseDriver 来产生驱动,还使用配置文件读取器去取配置文件和使用了 redis 工具类拿到连接。在 BaseDriver 中主要是做各种浏览器的配置

  • common 包

    含有 BaseBrowser 和 BasePage 两个类,BaseBrowser 主要是对最基本的元素和页面方法进行了,BasePage 主要是对不同页面相似的复杂操作进行封装

  • PO 对象

    data 包关注页面数据,locator 包关注页面元素定位,page 包关注页面操作

  • testcase 包

    其中的都是测试用例,测试用例都会继承 BaseTest,并且其中会调用 page 包中的页面类并调用其中的方法进行测试

  • testng.xml

    测试用例组织

  • listener 包

    测试中的监听器,实现截图,测试报告等

  • util 包

    工具类

  • 其他

    其他

关键代码

  • BaseTest 关键代码

    @BeforeTest(alwaysRun = true)
        @Parameters({"browserName", "terminal", "deviceName", "remoteIP", "remotePort", "browserVersion"})
        public void beforeTest(@Optional("chrome") String browserName, @Optional("pc") String terminal, @Optional("desktop") String deviceName, @Optional() String remoteIP, @Optional("4444") int remotePort, @Optional() String browserVersion) throws Exception {
            /* redis 新连接获取 */
            redisUtil = new RedisUtil();
            // 拿到一个新的 jedis 连接,设置 redisUtil 中的 jedis 以及键值超时时间
            redisUtil.setJedisAndExpire(redisUtil.getNewJedis());
            jedis = redisUtil.getJedis();
            /* 驱动配置 */
            baseDriver = new BaseDriver();
            // 如果不存在 hub 地址
            if (remoteIP == null || remoteIP.isEmpty()) {
                baseDriver.startBrowser(browserName, terminal, deviceName);
            }
            // 如果存在 hub 地址
            else {
                baseDriver.startBrowser(browserName, terminal, deviceName, remoteIP, remotePort, browserVersion);
            }
            driver = baseDriver.getDriver();
        }
    
  • 驱动启动关键代码

    try {
                        // 系统变量设置谷歌驱动
                        System.setProperty("webdriver.chrome.driver", chromeDriverPath);
                        // 下载地址设置
                        HashMap<String, Object> hashMap = new HashMap<>();
                        hashMap.put("download.default_directory", downloadPath);
                        // 驱动可选项配置
                        ChromeOptions chromeOptions = new ChromeOptions();
                        chromeOptions.setExperimentalOption("prefs", hashMap);
                        chromeOptions.addArguments("--no-sandbox");
                        chromeOptions.addArguments("--disable-dev-shm-usage");
                        // 如果是 h5 需要另外设置
                        if (terminal.equals("h5")) {
                            Map<String, String> mobileEmulationMap = new HashMap<>();
                            mobileEmulationMap.put("deviceName", deviceName);
                            chromeOptions.setExperimentalOption("mobileEmulation", mobileEmulationMap);
                        }
                        // 启动 RemoteWebDriver
                        driver = new ChromeDriver(chromeOptions);
                    } catch (Exception e) {
                        e.printStackTrace();
                        log.error(browserName + "浏览器启动失败!");
                    }
    
  • hub 相关代码

    driver = new RemoteWebDriver(new URL("http://" + remoteIP + ":" + remotePort + "/wd/hub/"), chromeOptions);
    
  • 测试用例代码

    public class BaiduTest extends BaseTest {
        /**
         * 百度页面对象
         */
        private BaiduPage baiduPage;
    
        @Test(description = "百度首页_搜索测试", priority = 1)
        public void testSearch() {
            // 初始化百度页面
            baiduPage = new BaiduPage(driver, redisUtil);
            // 进入百度首页
            baiduPage.jumpPage();
            // 百度页面搜索检测
            assert baiduPage.search();
        }
    }
    

注意点

  1. 没有装 redis 的话也没关系,项目运行也能正常执行测试用例,虽然控制台显示 redis 连接不到,但是执行测试用例产出报告一套流程是没有丝毫影响的

  2. 项目中运行到 BeforeTest 时候会是一个新的线程,一个线程含有一个驱动和一个 redis 连接

  3. pom.xml 文件报红是正常的,并不影响 mvn test 的执行,报红是因为其中进行了外部传参,这个项目可以配置到 jenkins 中,jenkins 的 job 中创建几个参数,这些参数就可以传进 pom 文件中了,再从 pom 文件中成功传入 testng.xml 和测试用例中

  4. 建议采用谷歌浏览器,项目中谷歌驱动是 79 版本的

待优化

  1. 目前支持谷歌,火狐,欧朋,Edge,IE 浏览器,以后会考虑加上对无界面浏览器和 safari 浏览器的支持

  2. 目前对于 h5 的支持只有谷歌浏览器,往后会考虑 h5 支持火狐

  3. 往后会考虑将 redis 是否启用这一参数加进项目配置文件

  4. 往后会考虑项目中编写该项目的异常类型,目前该项目没有编写其自有的异常类

Open Source Agenda is not affiliated with "Webuitest4j" Project. README Source: abcnull/webuitest4j

Open Source Agenda Badge

Open Source Agenda Rating