项目背景
初学springboot的第一个项目,这是一款基于SSM框架结合WebSocket技术打造的网页版五子棋游戏,免下载安装,打开网页就能随时享受下棋乐趣。它最核心的功能是双人在线对战,在匹配系统中随机与其他玩家开启棋局。WebSocket技术确保了下棋过程中,双方落子信息能实时同步,几乎没有延迟,让对弈流畅又丝滑。在界面设计上,它简洁美观,棋盘与棋子的绘制精致,操作也十分简单,新手玩家能快速上手。除了实时对弈,游戏还贴心地提供了复盘功能,方便玩家回顾棋局,总结经验,提升棋艺。不管是想在闲暇时光杀上几盘,还是和棋友交流切磋,这款网页版五子棋都能满足你。
项目测试
功能测试
部分界面截图
 {
if(driver == null) {
WebDriverManager.edgedriver().setup();
EdgeOptions options = new EdgeOptions();
//允许访问所有的链接
options.addArguments("--remote-allow-origins=*");
driver = new EdgeDriver(options);
//隐式等待(全局情况,查找元素的时候都让它等待2秒)
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
}
return driver;
}
public Utils(String url) {
driver = createDriver();
driver.get(url);
}
public List<String> getTime(){
//文件能不能按照天的维度按文件夹进行保存
//文件格式 20230212-123030毫秒
SimpleDateFormat sim1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");
SimpleDateFormat sim2 = new SimpleDateFormat("yyyyMMdd");
String filename = sim1.format(System.currentTimeMillis());
String dirname = sim2.format(System.currentTimeMillis());
List<String> list = new ArrayList<>();
list.add(dirname);
list.add(filename);
return list;
}
/**
* 获取屏幕截图,把所有的用例执行的结果保存下来
*/
public void getScreenShot(String str) throws IOException, AWTException {
driver.quit();
List<String> timeParts = getTime();
// 构建路径
String dirPath = Paths.get("./src/test/java/com/blogWebAutoTest", timeParts.get(0)).toString();
String filename = String.format("%s_%s.png", str, timeParts.get(1));
File destFile = new File(dirPath, filename);
// 自动创建目录
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs(); // 创建多级目录
}
// 截图并保存
// 使用 Robot 类截屏
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage screenFullImage = new Robot().createScreenCapture(screenRect);
// 保存截图
ImageIO.write(screenFullImage, "png", destFile);
System.out.println("IDEA运行截图已保存至: " + destFile.getAbsolutePath());
}
}
RegisterTest
public class RegisterTest extends Utils {
private static String url = "http://localhost:8080/register.html";
public RegisterTest() {
super(url);
}
public void registerFail() {
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
// 空账号空密码测试
driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("");
driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
// 处理弹窗(确认)
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert(); // 切换到弹窗
alert.accept(); // 点击确认(相当于点击"OK")
driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("laoliu1");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("");
driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert(); // 切换到弹窗
alert.accept(); // 点击确认(相当于点击"OK")
driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert(); // 切换到弹窗
alert.accept(); // 点击确认(相当于点击"OK")
}
public void registerSuccess() throws InterruptedException {
// 等待页面加载完成
// 第一次注册
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
// wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));
// driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();
// driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
// driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("laoliu1");
// driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
// driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
//
// // 处理第一个弹窗
// try {
// wait.until(ExpectedConditions.alertIsPresent());
// Alert alert = driver.switchTo().alert();
// alert.accept();
// } catch (Exception e) {
// System.out.println("第一个弹窗处理失败: " + e.getMessage());
// }
driver.get(url);
// // 等待页面元素重新加载
// 第二次注册
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"username\"]")));
driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("ceshi");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
// 处理第二个弹窗
try {
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
} catch (Exception e) {
System.out.println("第二个弹窗处理失败: " + e.getMessage());
}
// 等待页面跳转
wait.until(ExpectedConditions.urlToBe("http://localhost:8080/login.html"));
// 验证跳转
String currentUrl = driver.getCurrentUrl();
assert currentUrl.equals("http://localhost:8080/login.html") :
"Expected URL: http://localhost:8080/login.html, but got: " + currentUrl;
}
public void registerT() throws InterruptedException {
// 等待页面加载完成
// 创建显式等待对象
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
// 等待输入框元素可见
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));
// 输入注册信息
driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("laoliu2");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
// 点击提交按钮
driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
// 等待AJAX请求完成和弹窗出现
try {
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
} catch (Exception e) {
System.out.println("弹窗处理失败: " + e.getMessage());
throw e;
}
driver.quit();
}
}
LoginTest
public class LoginTest extends Utils {
private static String url = "http://localhost:8080/login.html";
public LoginTest() {
super(url);
}
public void LoginFail() {
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));
loginTest("", "");
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert(); // 切换到弹窗
alert.accept(); // 点击确认(相当于点击"OK")
loginTest("laoliu1", "");
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert(); // 切换到弹窗
alert.accept(); // 点击确认(相当于点击"OK")
loginTest("", "123");
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert(); // 切换到弹窗
alert.accept(); // 点击确认(相当于点击"OK")
loginTest("laoliu123", "123");
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert(); // 切换到弹窗
alert.accept(); // 点击确认(相当于点击"OK")
}
public void LoginSuccess() {
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
loginTest("ceshi", "123");
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert(); // 切换到弹窗
alert.accept(); // 点击确认(相当于点击"OK")
assert driver.getCurrentUrl().equals("http://localhost:8080/game_hall.html");
// driver.quit();
}
private static void loginTest(String username, String number) {
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.findElement(By.cssSelector("#password")).sendKeys(number);
driver.findElement(By.cssSelector("#submit")).click();
}
}
HallTest
public class HallTest extends Utils {
private static String url = "http://localhost:8080/game_hall.html";
public HallTest() {
super(url);
}
public void hallFail() {
// 清理登录状态
driver.manage().deleteAllCookies();
driver.get(url);
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
WebElement screen = wait.until(d -> {
WebElement el = d.findElement(By.id("screen"));
return el.getText().contains("玩家:") ? el : null;
});
// 获取所有文本节点(需注意浏览器兼容性)
List<WebElement> textNodes = driver.findElements(By.cssSelector("#screen > *"));
//解析整个文本
String fullText = screen.getText();
String[] lines = fullText.split("\n");
assertEquals("玩家: undefined", lines[0]);
driver.findElement(By.cssSelector("#match-button")).click();
assert driver.findElement(By.cssSelector("#match-button")).getText().equals("开始匹配") : "未登入状态进入游戏大厅匹配异常";
}
public void hallSuccess() {
driver.get("http://localhost:8080/login.html");
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#username")).sendKeys("ceshi");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
driver.findElement(By.cssSelector("#submit")).click();
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert(); // 切换到弹窗
alert.accept(); // 点击确认(相当于点击"OK")
// 等待页面跳转
wait.until(ExpectedConditions.urlToBe(url));
// 验证跳转
String currentUrl = driver.getCurrentUrl();
assert currentUrl.equals(url) :
"Expected URL: http://localhost:8080/game_hall.html, but got: " + currentUrl;
// wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"screen\"]/text()[1]")));;
WebElement screen = wait.until(d -> {
WebElement el = d.findElement(By.id("screen"));
return el.getText().contains("玩家:") ? el : null;
});
// 获取所有文本节点(需注意浏览器兼容性)
List<WebElement> textNodes = driver.findElements(By.cssSelector("#screen > *"));
String fullText = screen.getText();
String[] lines = fullText.split("\n");
assertEquals("玩家: ceshi", lines[0]);
driver.findElement(By.cssSelector("#match-button")).click();
System.out.println(driver.findElement(By.cssSelector("#match-button")).getText());
assert driver.findElement(By.cssSelector("#match-button")).getText().equals("匹配中...(点击取消)") : "登入状态点击开始匹配异常";
driver.findElement(By.cssSelector("#match-button")).click();
assert driver.findElement(By.cssSelector("#match-button")).getText().equals("开始匹配") : "登入状态点击取消匹配异常";
// driver.quit();
}
}
RoomTest
public class RoomTest extends Utils {
private static String url = "http://localhost:8080/game_room.html";
public RoomTest() {
super(url);
}
public void roomFail() {
driver.manage().deleteAllCookies();
driver.get(url);
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
wait.until(driver -> ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#screen")));
assert driver.findElement(By.cssSelector("#screen")).getText().equals("等待玩家连接中...") : "无状态访问游戏房间异常";
}
// public void roomSuccess() {
//
// }
}