[TOC]
**[English](https://github.com/abcnull/webuitest4j/blob/master/README_en.md) | [博客](https://blog.csdn.net/abcnull/article/details/104119940)**
**注意:此项目在不断的优化和拓展中,因此 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](https://github.com/abcnull/Image-Resources/blob/master/webuitest4j/1580447619807.png)
- base 包
有 BaseTest 测试基类,BaseDriver 驱动基类,在 BaseTest 中主要使用到了 BaseDriver 来产生驱动,还使用配置文件读取器去取配置文件和使用了 redis 工具类拿到连接。在 BaseDriver 中主要是做各种浏览器的配置
- common 包
含有 BaseBrowser 和 BasePage 两个类,BaseBrowser 主要是对最基本的元素和页面方法进行了,BasePage 主要是对不同页面相似的复杂操作进行封装
- PO 对象
data 包关注页面数据,locator 包关注页面元素定位,page 包关注页面操作
- testcase 包
其中的都是测试用例,测试用例都会继承 BaseTest,并且其中会调用 page 包中的页面类并调用其中的方法进行测试
- testng.xml
测试用例组织
- listener 包
测试中的监听器,实现截图,测试报告等
- util 包
工具类
- 其他
其他
# 关键代码
- BaseTest 关键代码
```java
@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();
}
```
- 驱动启动关键代码
```java
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 相关代码
```java
driver = new RemoteWebDriver(new URL("http://" + remoteIP + ":" + remotePort + "/wd/hub/"), chromeOptions);
```
- 测试用例代码
```java
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. 往后会考虑项目中编写该项目的异常类型,目前该项目没有编写其自有的异常类
该项目是 java 编写的使用 selenium 依赖包的 WebUI 测试项目.zip
需积分: 0 108 浏览量
更新于2024-01-14
收藏 15.07MB ZIP 举报
【Java实战:Selenium WebUI测试项目详解】
在软件开发领域,测试是不可或缺的一部分,确保产品的稳定性和功能的正确性。本项目是一个基于Java编写的Web用户界面(WebUI)自动化测试项目,它利用了Selenium这个强大的开源测试框架。Selenium支持多种编程语言,包括Java,Python,C#等,而本项目选择了Java作为主要的编程语言,以展示其在WebUI自动化测试中的应用。
我们需要了解Selenium的核心概念。Selenium WebDriver是Selenium的一个关键组件,它提供了一个API,可以直接与浏览器进行交互,模拟用户的行为,如点击按钮、填写表单、导航等。通过WebDriver,我们可以编写可重用的测试脚本,这些脚本可以在不同的浏览器环境中执行,提高了测试的覆盖率和效率。
在Java中,我们通常会使用Maven或Gradle这样的构建工具来管理项目的依赖。在这个项目中,Selenium的Java客户端驱动器应该是Maven或Gradle的依赖项,通过`pom.xml`或`build.gradle`文件进行配置。这些驱动器允许Java代码与特定的浏览器(如Chrome、Firefox等)进行通信。
在项目结构上,可能包含以下几个关键部分:
1. **Test Suite** - 这是一个包含多个测试用例的集合,通常以`TestNG`或`JUnit`这样的测试框架来组织。每个测试用例对应一个独立的WebUI功能,比如登录、注册、搜索等。
2. **Page Object Model (POM)** - 这是一种设计模式,用于封装页面元素和相关的操作,提高代码的可读性和可维护性。每个页面都有对应的Page类,包含了该页面上的元素对象和与之相关的操作方法。
3. **Base Class** - 基础类通常包含通用的设置和清理方法,如启动和关闭浏览器,初始化WebDriver实例等。
4. **Utility Classes** - 这些类包含了一些辅助方法,例如等待页面加载完成、验证元素存在等。
5. **Configuration Files** - 可能包含配置信息,如浏览器的路径、测试报告的设置、日志配置等。
在实际的测试脚本中,我们可能会看到类似以下的代码片段:
```java
public class LoginPage extends BaseClass {
private WebElement usernameField;
private WebElement passwordField;
private WebElement loginButton;
public LoginPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
@FindBy(id = "username")
public WebElement getUsernameField() {
return usernameField;
}
@FindBy(id = "password")
public WebElement getPasswordField() {
return passwordField;
}
@FindBy(xpath = "//button[text()='Login']")
public WebElement getLoginButton() {
return loginButton;
}
public void enterUsername(String username) {
getUsernameField().sendKeys(username);
}
public void enterPassword(String password) {
getPasswordField().sendKeys(password);
}
public HomePage login() {
getLoginButton().click();
return new HomePage(driver);
}
}
```
在这个例子中,`LoginPage`类代表了登录页面,使用了Page Object Model模式。`@FindBy`注解用于定位页面元素,`enterUsername`和`enterPassword`方法用于输入用户名和密码,`login`方法则模拟点击登录按钮并导航到首页。
在运行测试时,我们通常会使用测试执行器(如TestNG的`testng.xml`文件)来指定要运行的测试套件和顺序。测试结果可以生成详细的HTML报告,以便于分析测试结果和定位问题。
这个项目为学习和实践Java结合Selenium进行WebUI自动化测试提供了一个实际的平台。通过理解和运行这个项目,开发者可以深入掌握如何编写可维护、可扩展的测试代码,以及如何有效地自动化测试Web应用程序。