网页五子棋对战测试报告
网页五子棋对战测试报告
- 项目背景
- 项目测试
- 功能测试
- 部分界面截图
- 自动化测试
- Utils
- RegisterTest
- LoginTest
- HallTest
- RoomTest
项目背景
初学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() {
//
// }
}