[TOC]
注意:此项目在不断的优化和拓展中,因此 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 来持续构建
-
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(); } }
-
没有装 redis 的话也没关系,项目运行也能正常执行测试用例,虽然控制台显示 redis 连接不到,但是执行测试用例产出报告一套流程是没有丝毫影响的
-
项目中运行到 BeforeTest 时候会是一个新的线程,一个线程含有一个驱动和一个 redis 连接
-
pom.xml 文件报红是正常的,并不影响 mvn test 的执行,报红是因为其中进行了外部传参,这个项目可以配置到 jenkins 中,jenkins 的 job 中创建几个参数,这些参数就可以传进 pom 文件中了,再从 pom 文件中成功传入 testng.xml 和测试用例中
-
建议采用谷歌浏览器,项目中谷歌驱动是 79 版本的
-
目前支持谷歌,火狐,欧朋,Edge,IE 浏览器,以后会考虑加上对无界面浏览器和 safari 浏览器的支持
-
目前对于 h5 的支持只有谷歌浏览器,往后会考虑 h5 支持火狐
-
往后会考虑将 redis 是否启用这一参数加进项目配置文件
-
往后会考虑项目中编写该项目的异常类型,目前该项目没有编写其自有的异常类