欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 自动化测试项目2 --- 比特纵横 [软件测试实战 Java 篇]

自动化测试项目2 --- 比特纵横 [软件测试实战 Java 篇]

2025/5/3 7:14:29 来源:https://blog.csdn.net/zjt_2002/article/details/147579253  浏览:    关键词:自动化测试项目2 --- 比特纵横 [软件测试实战 Java 篇]

目录

项目介绍

项目源码 库地址

项目功能测试

1. 自动化实施步骤

1.1 编写测试用例

1.2 自动化测试脚本开发

1.2.1 配置相关环境, 添加依赖

1.2.2 代码编写

2. 编写自动化脚本过程问题总结

2.1 Actons 方法的使用

2.2 等待的使用

2.3 页面操作

项目性能测试

1. 进行性能测试

2. 生成测试报告 

项目总结

1. 部分使用缺陷总结

2. 测试结论与建议


项目介绍

// "比特纵横" 项目是一个专注于技术交流与知识分享的平台,旨在为开发者、技术爱好者及专业人士提供一个便捷、高效的互动空间;​

// 在功能方面,它支持用户发布技术文章、提出问题、分享项目和私信交流经验等。无论是探讨热门的编程语言、交流前沿的技术框架,还是解决开发过程中遇到的实际难题,都能在这里实现。用户可以对感兴趣的内容进行评论、点赞和私信回复,方便随时与他人交流看法。同时,系统具备强大的导航栏功能,用户能够快速定位到自己需要的技术内容;

// 使用本技术论坛系统,用户可以拓展技术视野,学习他人的优秀经验,提升自身技术水平。同时,还能结识志同道合的朋友,共同成长进步,助力每一位技术人在探索之路上不断前行。​

项目源码 库地址

比特纵横项目 git 库地址, 点击跳转https://gitee.com/zhou-jintao2002/forum-auto-test

项目功能测试

1. 自动化实施步骤

1.1 编写测试用例

1.2 自动化测试脚本开发

1.2.1 配置相关环境, 添加依赖

// 自动化测试基础知识及相关函数, 包括 Selenium 的安装和使用基础教程

1.2.2 代码编写

// 我们按照上面图中的不同分类层级分别进行创建, 方便后期代码视为管理和修改

// 以下是具体的代码内容, 需要源码可以点击上面的链接在 git 仓库中进行观看和引用

Utils.java

/*
通用配置*/
public class Utils {public static WebDriver driver;public static  WebDriver createDriver() {if (driver == null) {// 创建驱动对象WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();// 设置无头模式options.addArguments("-headless");// 设置浏览器加载策略options.setPageLoadStrategy(PageLoadStrategy.NORMAL);// 允许访问所以链接options.addArguments("--remote-allow-origins=*");// 驱动创建好了driver = new ChromeDriver(options);// 创建隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));}return driver;}public Utils(String url) {// 调用 driver 对象driver = createDriver();// 访问 urldriver.get(url);}/*创建屏幕截图*/public void getScreenShot(String str) throws IOException {// 屏幕截图SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());// 生成文件的格式为: 年-月-日/test.类名-时分秒毫秒.pngString fileName = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";// System.out.printf("fileName:" + fileName);File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);// srcFile 放到指定位置FileUtils.copyFile(srcFile,new File((filename)));}
}

RunTests.java 

/*
所有代码的运行*/
public class RunTests {public static void main(String[] args) throws InterruptedException {// 登录测试LoginPage login = new LoginPage();login.LoginPageRight();login.LoginSuc();login.LoginNoUserNameAndPassword();login.LoginNoUserName();login.LoginNoPassward();login.LoginUserNameError();login.LoginPasswordError();// 注册测试RegisterPage regist = new RegisterPage();regist.ReqisterPageRight();regist.GitContent();regist.ReqisterReturnLogin();regist.RegisterSuc();regist.RegisterNoUserName();regist.RegisterNoNickName();regist.RegisterNoPassword();regist.RegisterPasswordAdmitFailuer();regist.RegisterNoAgreeAccord();// 论坛首页测试HomePage home = new HomePage();home.HomeLogin();home.HomeSearch();home.HomeColorSwitch();home.HomeReceiveMessages();home.HomeCloseMessage();home.HomeReplyMessage();home.HomeMyAccountSuc();home.HomeCloseMyAccount();home.HomePostSkip();// 帖子详情页测试PostDetailsPage postDetails = new PostDetailsPage();postDetails.HomeOpenSuc();postDetails.PostOpen();postDetails.PostThumbsUp();postDetails.PostRewriteEnter();postDetails.PostRewrite();postDetails.PostDelete();postDetails.PostReply();// 新发布帖子测试AddPostPage addPost = new AddPostPage();addPost.AddPostEnter();addPost.AddPost();// 用户详情页测试UserInfoPage userInfo = new UserInfoPage();userInfo.UserInfoEnter();userInfo.PasswordChange();userInfo.PasswordChangeFail1();userInfo.PassWordChangeFail2();// 我的帖子页测试MyPostsPage myPost = new MyPostsPage();myPost.MyPostEter();myPost.PostEnterSuc();// 未登录的所有测试PageByNoLogin noLogin = new PageByNoLogin();noLogin.ByNoLogin();Thread.sleep(1000);driver.quit();}
}

 LoginPage.java

/*
登录功能测试*/
public class LoginPage extends Utils {public static String url = "http://127.0.0.1:58080/sign-in.html";public LoginPage() {super(url);}// 检查登录界面是否正常打开public void LoginPageRight() throws InterruptedException {// 获取页面元素String loginname = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2")).getText();// 断言检查assert loginname.equals("用户登录");}// 成功登录public void LoginSuc() throws InterruptedException {// 刷新页面driver.navigate().refresh();// 输入账号密码,并点击登录按钮driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 通过断言检查是否登录成功String title = driver.findElement(By.cssSelector("#article_list_board_title")).getText();assert title.equals("首页");}// 异常登录 (用户名和密码都为空)public void LoginNoUserNameAndPassword() throws InterruptedException {// 从成功登录界面回退到登录界面driver.navigate().back();// 刷新界面, 清空输入框中的内容driver.navigate().refresh();// 找到用户名输入框, 输入为空driver.findElement(By.cssSelector("#username")).sendKeys("");// 找到密码输入框, 输入为空driver.findElement(By.cssSelector("#password")).sendKeys("");// 点击登录按钮driver.findElement(By.cssSelector("#submit")).click();// 检查用户名输入框下面的提示是否为"用户名不能为空"String tip1 = driver.findElement(By.cssSelector("#signInForm > div.mb-3 > div")).getText();assert tip1.equals("用户名不能为空");// 检查密码输入框下面的提示是否为"密码不能为空"String tip2 = driver.findElement(By.cssSelector("#signInForm > div.mb-2 > div > div")).getText();assert tip2.equals("密码不能为空");}// 异常登录 (用户名为空)public void LoginNoUserName() {// 刷新界面, 清空输入框中的内容driver.navigate().refresh();// 找到用户名输入框, 输入为空driver.findElement(By.cssSelector("#username")).sendKeys("");// 找到密码输入框, 输入正确密码driver.findElement(By.cssSelector("#password")).sendKeys("123");// 点击登录按钮driver.findElement(By.cssSelector("#submit")).click();// 检查用户名输入框下面的提示是否为"用户名不能为空"String tip1 = driver.findElement(By.cssSelector("#signInForm > div.mb-3 > div")).getText();assert tip1.equals("用户名不能为空");}// 异常登录 (密码为空)public void LoginNoPassward() {// 刷新界面, 清空输入框中的内容driver.navigate().refresh();// 找到用户名输入框, 输入用户名driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");// 找到密码输入框, 输入为空driver.findElement(By.cssSelector("#password")).sendKeys("");// 点击登录按钮driver.findElement(By.cssSelector("#submit")).click();// 检查密码输入框下面的提示是否为"密码不能为空"String tip1 = driver.findElement(By.cssSelector("#signInForm > div.mb-2 > div > div")).getText();assert tip1.equals("密码不能为空");}// 异常登录(用户名错误)public void LoginUserNameError() throws InterruptedException {// 刷新界面, 清空输入框中的内容driver.navigate().refresh();// 找到用户名输入框, 输入错误的用户名driver.findElement(By.cssSelector("#username")).sendKeys("zhngsan");// 找到密码输入框, 输入正确的密码driver.findElement(By.cssSelector("#password")).sendKeys("123");// 点击登录按钮driver.findElement(By.cssSelector("#submit")).click();// 获取 urlThread.sleep(1000);String loginUrl = driver.getCurrentUrl();// 判断当前是否还是登录页面, 还在登录页面则说明登录失败assert loginUrl.equals("http://127.0.0.1:58080/sign-in.html");}// 异常登录(密码错误)public void LoginPasswordError() throws InterruptedException {// 刷新界面, 清空输入框中的内容driver.navigate().refresh();// 找到用户名输入框, 输入正确的用户名driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");// 找到密码输入框, 输入正确的密码driver.findElement(By.cssSelector("#password")).sendKeys("1243");// 点击登录按钮driver.findElement(By.cssSelector("#submit")).click();// 获取 urlThread.sleep(1000);String loginUrl = driver.getCurrentUrl();// 判断当前是否还是登录页面, 还在登录页面则说明登录失败assert loginUrl.equals("http://127.0.0.1:58080/sign-in.html");}
}

 RegisterPage.java

/*
注册功能测试*/
public class RegisterPage extends Utils {public static String url = "http://127.0.0.1:58080/sign-up.html";public RegisterPage() {super(url);}// 检查注册页面是否正常打开public void ReqisterPageRight() {// 获取界面元素String title = driver.findElement(By.cssSelector("#signUpForm > div > h2")).getText();// 通过断言判断界面是否加载啊成功assert title.equals("用户注册");}/*部分按钮测试*/// 测试显示/隐藏密码的按钮是否正常// 因为前端获取不到文本信息, 所以自动化代码无法测试, 但是肉眼可以观察到这个功能正常public void GitContent() throws InterruptedException {// 在密码输入框输入密码driver.findElement(By.cssSelector("#password")).sendKeys("1122");// 点击隐藏/显示密码 按钮driver.findElement(By.cssSelector("#signUpForm > div > div:nth-child(4) > div > span")).click();Thread.sleep(2000);// 获取密码String passwardShow = driver.findElement(By.cssSelector("#password")).getText();// 断言判断assert passwardShow.equals("1122");
//        System.out.println(passwardShow);
//        System.out.println("1");}// 返回登录按钮测试public void ReqisterReturnLogin() {// 点击登录按钮driver.findElement(By.cssSelector("body > div > div > div.text-center.text-muted.mt-3 > a")).click();// 通过断言判断是否成功返回String loginUrl = driver.getCurrentUrl();assert loginUrl.equals("http://127.0.0.1:58080/sign-in.html");}/*注册功能测试*/// 注册成功// 注册用户名每次测试都需要更改public void RegisterSuc() throws InterruptedException {// 返回注册页面操作driver.navigate().back();// 刷新页面, 确保输入框无内容driver.navigate().refresh();// 输入正确的用户名driver.findElement(By.cssSelector("#username")).sendKeys("ceshi1.3");// 输入正确的昵称driver.findElement(By.cssSelector("#nickname")).sendKeys("ceshi13");// 输入正确的密码driver.findElement(By.cssSelector("#password")).sendKeys("111");// 输入真确的确认密码driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("111");// 勾选同意按钮driver.findElement(By.cssSelector("#policy")).click();// 点击注册driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(2000);// 获取界面 urlString loginUrl = driver.getCurrentUrl();// 断言检测是否跳转到登录页面assert loginUrl.equals("http://127.0.0.1:58080/sign-in.html");}// 注册失败 (用户名为空)public void RegisterNoUserName() {// 重新返回注册页进行操作driver.navigate().back();// 刷新页面, 确保输入框无内容driver.navigate().refresh();// 在用户名输入框输入空driver.findElement(By.cssSelector("#username")).sendKeys("");// 需要点击一下页面之后才会出现提示driver.findElement(By.cssSelector("#submit")).click();// 获取输入框下的提示信息String tip1 = driver.findElement(By.cssSelector("#signUpForm > div > div:nth-child(2) > div")).getText();// 断言检测提示信息是否为"用户名不能为空"assert tip1.equals("用户名不能为空");}// 注册失败 (昵称为空)public void RegisterNoNickName() {// 刷新页面, 确保输入框无内容driver.navigate().refresh();// 在昵称输入框输入空driver.findElement(By.cssSelector("#nickname")).sendKeys("");// 需要点击一下页面之后才会出现提示driver.findElement(By.cssSelector("#submit")).click();// 获取输入框下的提示信息String tip1 = driver.findElement(By.cssSelector("#signUpForm > div > div:nth-child(3) > div")).getText();// 断言检测提示信息是否为"昵称不能为空"assert tip1.equals("昵称不能为空");}// 注册失败 (密码为空)public void RegisterNoPassword () {// 刷新页面, 确保输入框无内容driver.navigate().refresh();// 在密码输入框中输入空driver.findElement(By.cssSelector("#password")).sendKeys("");// 点击一下页面driver.findElement(By.cssSelector("#submit")).click();// 获取输入框下的提示信息String tip2 = driver.findElement(By.cssSelector("#signUpForm > div > div:nth-child(4) > div > div")).getText();// 断言检测是否为"密码不能为空"assert tip2.equals("密码不能为空");}// 注册失败 (确认密码不正确)public void RegisterPasswordAdmitFailuer() {// 刷新页面driver.navigate().refresh();// 在密码输入框中输入正确的密码driver.findElement(By.cssSelector("#password")).sendKeys("123");// 在确认密码框输入与原密码不同的密码driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("12");// 点击一下页面driver.findElement(By.cssSelector("#submit")).click();// 获取输入框下的提示信息String tip3 = driver.findElement(By.cssSelector("#signUpForm > div > div:nth-child(5) > div > div")).getText();// 断言检测是否为"请检查确认密码"assert tip3.equals("请检查确认密码");}// 注册失败 (未勾选同意协议框)public void RegisterNoAgreeAccord() {// 刷新界面, 确保输入框为空driver.navigate().refresh();// 在用户名输入框输入正确的用户名driver.findElement(By.cssSelector("#username")).sendKeys("ceshi2");// 在昵称输入框输入真确的昵称driver.findElement(By.cssSelector("#nickname")).sendKeys("ceshi2.0");// 在密码输入框输入正确的密码driver.findElement(By.cssSelector("#password")).sendKeys("123");// 在确认密码输入框输入正确的密码driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123");// 点击注册driver.findElement(By.cssSelector("#submit")).click();// 获取页面 urlString registerUrl = driver.getCurrentUrl();// 断言检查是否为注册界面的url, 以此判断不勾选同意协议框是否能注册成功assert registerUrl.equals("http://127.0.0.1:58080/sign-up.html");}
}

 HomePage.java

/*
论坛首页测试*/
public class HomePage extends Utils {public static String url = "http://127.0.0.1:58080/sign-in.html";public HomePage() {super(url);}/*未登录状态下 --- 访问论坛首页由 PageByNoLogin 进行测试*//*登录状态下 --- 测试论坛首页*/// 检查页面(论坛首页)是否加载成功public void HomeLogin() throws InterruptedException {// 返回登录页并刷新页面driver.navigate().refresh();// 重新登录driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 加一个显式等待WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));wait.until(ExpectedConditions.urlToBe("http://127.0.0.1:58080/index.html"));// 获取首页 urlString HomeUrl = driver.getCurrentUrl();// 断言判断是否跳转到了论坛首页assert HomeUrl.equals("http://127.0.0.1:58080/index.html");}// 搜索功能测试public void HomeSearch() throws InterruptedException {// 找到搜索框并输入想要搜索的内容driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.d-none.d-md-flex.me-3 > div > form > div > input")).sendKeys("1");// 点击搜索按钮(没有点击按钮, 选择从键盘输入 Enter 跳转)
//        driver.findElement(By.cssSelector("")).click();// 查找搜索框元素WebElement element = driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.d-none.d-md-flex.me-3 > div > form > div > input"));// 鼠标选中搜索框并点击Actions actions = new Actions(driver);actions.click(element).perform();// 键盘输入 Enter 进行搜索
//        actions.keyDown(Keys.ENTER).perform();// 因为 Enter 键一般不单独使用, 需要结合其他 Alt 按键使用, 所以修改代码actions.sendKeys(Keys.ENTER).build().perform();// 添加显式等待WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));wait.until(ExpectedConditions.urlToBe("http://127.0.0.1:58080/?"));// 获取当前页面的 urlString searchUrl = driver.getCurrentUrl();// 断言检查是否搜索成功assert searchUrl.equals("http://127.0.0.1:58080/?");}//白天和夜间模式切换测试public void HomeColorSwitch() {// 找到模式切换按钮并点击, 即切换为夜间模式driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > a.nav-link.px-0.hide-theme-dark > svg")).click();// 添加显式等待WebDriverWait wait1 = new WebDriverWait(driver, Duration.ofSeconds(1));wait1.until(ExpectedConditions.urlToBe("http://127.0.0.1:58080/?theme=dark"));// 获取界面 urlString blackUrl = driver.getCurrentUrl();// 断言检查是否切换成功assert blackUrl.equals("http://127.0.0.1:58080/?theme=dark");// 再次点击模式切换按钮, 即切换为白天模式driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > a.nav-link.px-0.hide-theme-light > svg")).click();// 添加显式等待WebDriverWait wait2 = new WebDriverWait(driver, Duration.ofSeconds(1));wait2.until(ExpectedConditions.urlToBe("http://127.0.0.1:58080/?theme=light"));// 获取界面 urlString lighteUrl = driver.getCurrentUrl();// 断言判断是否切换成功assert lighteUrl.equals("http://127.0.0.1:58080/?theme=light");}// 接收站内消息通知测试public void HomeReceiveMessages() throws InterruptedException {// 点击消息查看按钮driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div > a > svg")).click();// 添加一个强制等待Thread.sleep(1000);//断言检查是否正常打开String receive = driver.findElement(By.cssSelector("#offcanvasEndLabel")).getText();assert receive.equals("所有站内信");}// 回复私信测试public void HomeReplyMessage() throws InterruptedException {// 点击消息查看消息详情driver.findElement(By.cssSelector("#index_div_message_list > div > div > div:nth-child(3)")).click();// 点击回复按钮driver.findElement(By.cssSelector("#btn_index_message_reply")).click();// 这个输入框不能直接交互, 所以先点击之后再输入WebElement write = driver.findElement(By.cssSelector("#index_message_reply_receive_content"));Actions actions = new Actions(driver);actions.click(write).perform();// 输入回复内容driver.findElement(By.cssSelector("#index_message_reply_receive_content")).sendKeys("收到!");// 点击发送按钮driver.findElement(By.cssSelector("#btn_index_send_message_reply")).click();}// 发送完之后关闭消息窗口public void HomeCloseMessage() {// 关闭查看消息页面driver.findElement(By.cssSelector("#index_message_offcanvasEnd > div.offcanvas-header > button")).click();}// 我的账户打开测试public void HomeMyAccountSuc() {// 点击头像打开driver.findElement(By.cssSelector("#index_nav_avatar")).click();// 获取界面信息String ele1 = driver.findElement(By.cssSelector("#index_user_settings")).getText();// 断言检测ele1.equals("个人中心");}// 查看完之后关闭我的账户页面public void HomeCloseMyAccount() {// 关闭我的账户页面driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none")).click();}// 导航栏跳转查看详细帖子测试(以Java 板块为例)public void HomePostSkip() throws InterruptedException {// 点击 Java 板块driver.findElement(By.cssSelector("#topBoardList > li:nth-child(2) > a")).click();// 获取该页帖子标题信息Thread.sleep(1000);String content = driver.findElement(By.cssSelector("#artical-items-body > div > div > div.col > div.text-truncate > a > strong")).getText();// 断言检查是否正确跳转assert content.equals("3");}
}

PostDetailsPage.java

/*
帖子详情页的测试*/
public class PostDetailsPage extends Utils {public static String url = "http://127.0.0.1:58080/index.html";public PostDetailsPage() {super(url);}// 首页打开测试public void HomeOpenSuc() {// 需要重新登录// 返回登录页并刷新页面driver.navigate().refresh();// 重新登录driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 获取界面元素String ele1 = driver.findElement(By.cssSelector("#article_list_board_title")).getText();// 断言判断是否打开成功assert ele1.equals("首页");}// 点击打开帖子, 查看详情public void PostOpen() {// 点击帖子标题, 进入帖子详情页driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();// 获取页面元素String ele2 = driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div:nth-child(2) > h3")).getText();// 断言判断是否进入帖子详情页assert ele2.equals("最新回复");}// 点赞功能测试public void PostThumbsUp() {// 点击点赞按钮driver.findElement(By.cssSelector("#details_btn_like_count")).click();// 获取当前点赞数String ele3 = driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(3)")).getText();// 断言判断是否正确assert ele3.equals("4");}// 编辑功能测试// 编辑页面进入测试public void PostRewriteEnter() throws InterruptedException {Thread.sleep(1000);// 点击编辑按钮, 进入编辑界面driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div:nth-child(1) > div.col-9.card.card-lg > div.card-footer.bg-transparent.mt-auto.justify-content-end > div > div:nth-child(2) > div")).click();// 获取界面元素Thread.sleep(1000);String ele4 = driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div > h2")).getText();// 断言判断是否进入成功assert ele4.equals("编辑");}// 编辑内容测试public void PostRewrite() throws InterruptedException {// 找到标题框元素WebElement ele5 = driver.findElement(By.cssSelector("#edit_article_title"));// 点击帖子标题框Actions actions = new Actions(driver);actions.click(ele5).perform();// 清空原有内容
//        actions.keyDown(Keys.BACK_SPACE).perform();
//        driver.findElement(By.cssSelector("#edit_article_title")).sendKeys("");actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).perform();actions.sendKeys("").perform();// 输入修改内容// 也可以用 action.sendKeys();driver.findElement(By.cssSelector("#edit_article_title")).sendKeys("1.5");// 获取修改后的内容
//        String ele6 = driver.findElement(By.cssSelector("#edit_article_title")).getText();// 找到帖子详情内容修改框WebElement ele7 = driver.findElement(By.cssSelector("#edit_article_content_area > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll"));// 点击内容修改框actions.click(ele7).perform();// 清空原有内容
//        Thread.sleep(1000);
//        actions.keyDown(Keys.BACK_SPACE).perform();
//        driver.findElement(By.cssSelector("#edit_article_content_area > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre")).sendKeys("");actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).perform();actions.sendKeys("").perform();// 输入要修改的内容
//        driver.findElement(By.cssSelector("#edit_article_content_area > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre")).sendKeys("2.01");actions.sendKeys("1.50").perform();// 点击提交按钮Thread.sleep(1000);WebElement ele8 = driver.findElement(By.cssSelector("#edit_article_submit"));actions.click(ele8).perform();// 获取新帖子标题信息Thread.sleep(2000);String ele9 = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate")).getText();// 断言判断修改后的帖子标题, 看是否和修改内容相同assert ele9.equals("1.5");}// 删除功能测试public void PostDelete() {// 进入帖子详情页driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();// 点击删除按钮driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div:nth-child(1) > div.col-9.card.card-lg > div.card-footer.bg-transparent.mt-auto.justify-content-end > div > div:nth-child(3) > div > a")).click();// 点击确认按钮driver.findElement(By.cssSelector("#details_artile_delete")).click();// 通过获取新界面的 url 来通过断言判断是否删除成功返回首页String homeUrl = driver.getCurrentUrl();assert homeUrl.equals("http://127.0.0.1:58080/index.html");}// 回复功能测试public void PostReply() throws InterruptedException {// 进入帖子详情页driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();// 找到回复输入框元素WebElement ele9 =driver.findElement(By.cssSelector("#article_details_reply > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre"));// 点击输入框Actions actions = new Actions(driver);actions.click(ele9).perform();// 输入想要发送的内容Thread.sleep(1000);actions.sendKeys("11").perform();//driver.findElement(By.cssSelector("#article_details_reply > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll")).sendKeys("测试回复1");// 点击回复Thread.sleep(3000);driver.findElement(By.cssSelector("#details_btn_article_reply")).click();}
}

 AddPostPage.java

/*
新帖发布的测试*/
public class AddPostPage extends Utils {public static String url = "http://127.0.0.1:58080/index.html";public AddPostPage() {super(url);}// 进入发帖界面public void AddPostEnter() throws InterruptedException {// 需要重新登陆// 返回登录页并刷新页面driver.navigate().refresh();// 重新登录driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 点击 "发布帖子" 按钮 进入发帖界面driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();// 获取界面元素Thread.sleep(1000);String ele1 = driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none")).getText();// 断言判断是否成功进入assert ele1.equals("发新贴");}// 发布新帖测试public void AddPost() throws InterruptedException {// 获取标题输入框元素WebElement ele2 = driver.findElement(By.cssSelector("#article_post_title"));// 点击输入框Actions actions = new Actions(driver);actions.click(ele2).perform();// 输入标题actions.sendKeys("自动输入的标题2");
//        // 获取输入的标题内容
//        String ele3 = driver.findElement(By.cssSelector("#article_post_title")).getText();// 获取内容输入框元素WebElement ele4 = driver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre"));// 点击输入框actions.click(ele4).perform();// 输入内容actions.sendKeys("自动输入的内容2").perform();// 点击发布按钮// 不能用显式等待, 发布按钮执行太快WebElement ele5 = driver.findElement(By.cssSelector("#article_post_submit"));
//        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));
//        wait.until(ExpectedConditions.elementToBeClickable(ele5));// 两种点击方式: 1. 界面定位元素点击; 2. 定位元素模拟鼠标点击
//        driver.findElement(By.cssSelector("#article_post_submit")).click();Thread.sleep(2000);actions.click(ele5).perform();// 刷新页面driver.navigate().refresh();// 获取新页面第一个帖子的标题String ele6 = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a")).getText();// 断言判断是否发布成功assert ele6.equals("自动输入的标题2");}
}

UserInfoPage.java 

/*
用户详情页测试*/
public class UserInfoPage extends Utils {public static String url = "http://127.0.0.1:58080/index.html";public UserInfoPage() {super(url);}// 进入个人中心测试public void UserInfoEnter() throws InterruptedException {// 需要重新登录// 返回登录页并刷新页面driver.navigate().refresh();// 重新登录driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 点击 "用户头像" 按钮, 进入选择进入用户个人中心界面driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();// 点击 "个人中心" 按钮, 进入个人中心driver.findElement(By.cssSelector("#index_user_settings")).click();// 获取界面元素WebElement ele1 = driver.findElement(By.cssSelector("#settings_submit_password"));WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));wait.until(ExpectedConditions.elementToBeClickable(ele1));String ele2 = driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div > div.col-3.d-none.d-md-block.border-end > div > div > a")).getText();// 断言判断是否成功进入assert ele2.equals("我的账户");}// 昵称, 邮箱地址, 电话号, 个人介绍 修改后都找不到可以对比的值, 人工测试都正常, 就不加入自动化脚本中了// 密码修改成功测试public void PasswordChange() {// 找到原密码输入框WebElement ele3 = driver.findElement(By.cssSelector("#settings_input_oldPassword"));// 点击原密码输入框Actions actions = new Actions(driver);actions.click(ele3).perform();// 输入原密码actions.sendKeys("123").perform();// 找到新原密码输入框WebElement ele4 = driver.findElement(By.cssSelector("#settings_input_newPassword"));// 点击新原密码输入框actions.click(ele4).perform();// 输入新原密码actions.sendKeys("123").perform();// 找到确认密码输入框WebElement ele5 = driver.findElement(By.cssSelector("#settings_input_passwordRepeat"));// 点击确认密码输入框actions.click(ele5).perform();// 输入确认密码actions.sendKeys("123").perform();// 点击修改密码按钮WebElement ele6 = driver.findElement(By.cssSelector("#settings_submit_password"));WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(1));wait.until(ExpectedConditions.elementToBeClickable(ele6));actions.click(ele6).perform();// 断言检查是否修改成功 (修改成功后跳转到登录页面)wait.until(ExpectedConditions.urlToBe("http://127.0.0.1:58080/sign-in.html"));String ele7 = driver.getCurrentUrl();assert ele7.equals("http://127.0.0.1:58080/sign-in.html");}// 密码修改失败 (原密码输入错误)public void PasswordChangeFail1() {// 重新登录driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 点击 "用户头像" 按钮, 进入选择进入用户个人中心界面driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();// 点击 "个人中心" 按钮, 进入个人中心driver.findElement(By.cssSelector("#index_user_settings")).click();// 找到原密码输入框WebElement ele8 = driver.findElement(By.cssSelector("#settings_input_oldPassword"));// 点击原密码输入框Actions actions = new Actions(driver);actions.click(ele8).perform();// 输入原密码actions.sendKeys("1234").perform();// 找到新原密码输入框WebElement ele9 = driver.findElement(By.cssSelector("#settings_input_newPassword"));// 点击新原密码输入框actions.click(ele9).perform();// 输入新原密码actions.sendKeys("123").perform();// 找到确认密码输入框WebElement ele10 = driver.findElement(By.cssSelector("#settings_input_passwordRepeat"));// 点击确认密码输入框actions.click(ele10).perform();// 输入确认密码actions.sendKeys("123").perform();// 点击修改密码按钮WebElement ele11 = driver.findElement(By.cssSelector("#settings_submit_password"));WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(1));wait.until(ExpectedConditions.elementToBeClickable(ele11));actions.click(ele11).perform();// 通过获取界面 url 来判断修改是否成功String ele12 = driver.getCurrentUrl();assert ele12.equals("http://127.0.0.1:58080/index.html");}// 密码修改失败 (确认密码错误)public void PassWordChangeFail2() {// 找到原密码输入框WebElement ele13 = driver.findElement(By.cssSelector("#settings_input_oldPassword"));// 点击原密码输入框Actions actions = new Actions(driver);actions.click(ele13).perform();// 输入原密码actions.sendKeys("123").perform();// 找到新原密码输入框WebElement ele14 = driver.findElement(By.cssSelector("#settings_input_newPassword"));// 点击新原密码输入框actions.click(ele14).perform();// 输入新原密码actions.sendKeys("123").perform();// 找到确认密码输入框WebElement ele15 = driver.findElement(By.cssSelector("#settings_input_passwordRepeat"));// 点击确认密码输入框actions.click(ele15).perform();// 输入确认密码actions.sendKeys("1234").perform();// 点击修改密码按钮WebElement ele16 = driver.findElement(By.cssSelector("#settings_submit_password"));WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(1));wait.until(ExpectedConditions.elementToBeClickable(ele16));actions.click(ele16).perform();// 通过获取界面 url 来判断修改是否成功String ele17 = driver.getCurrentUrl();assert ele17.equals("http://127.0.0.1:58080/index.html");}
}

MyPostsPage.java 

/*
我的帖子页测试*/
public class MyPostsPage extends Utils {public static String url = "http://127.0.0.1:58080/index.html";public MyPostsPage() {super(url);}// 进入我的帖子测试public void MyPostEter() {// 需要重新登录// 返回登录页并刷新页面driver.navigate().refresh();// 重新登录driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 点击 "用户头像" 按钮, 进入选择进入用户我的帖子界面driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown")).click();// 点击 "我的帖子" 按钮, 进入个人中心driver.findElement(By.cssSelector("#index_user_profile")).click();// 获取界面元素WebElement ele1 = driver.findElement(By.cssSelector("#profile_article_body > li:nth-child(1) > div.card.timeline-event-card > div > div > div > div > div.text-truncate"));WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));wait.until(ExpectedConditions.elementToBeClickable(ele1));String ele2 = driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div.col-lg-4 > div > div > div > div > h2")).getText();// 断言判断是否成功进入assert ele2.equals("个人介绍");}// 点击帖子进入帖子详情页// 因为帖子是动态变化的, 无法选中标题从而进入, 人为测试正常, 自动化测试脚本跳过public void PostEnterSuc() {// 选择一篇帖子标题, 点击进入driver.findElement(By.cssSelector("#profile_article_body > li:nth-child(1) > div.card.timeline-event-card > div > div > div > div > div.text-truncate")).click();// 获取页面元素WebElement ele3 = driver.findElement(By.cssSelector("#details_btn_like_count"));WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));wait.until(ExpectedConditions.elementToBeClickable(ele3));// 断言判断是否进入assert ele3.equals("点赞");}
}

PageByNoLogin.java 

/*
所以没有登录界面的测试*/
public class PageByNoLogin extends Utils {public static String url = "http://127.0.0.1:58080/index.html";public PageByNoLogin() {super(url);}// 判断是否为未登录状态public void ByNoLogin() throws InterruptedException {// 刷新页面driver.navigate().refresh();// 获取界面 urlThread.sleep(1000);String url1 = driver.getCurrentUrl();System.out.println(url1);// 断言判断是否为登录页面的 urlWebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.urlToBe("http://127.0.0.1:58080/sign-in.html"));assert url1.equals("http://127.0.0.1:58080/sign-in.html");}
}

// 部分代码在其他设备上运行可能会出现报错, 我们可以在评论区交流

2. 编写自动化脚本过程问题总结

2.1 Actons 类的使用

// 有些输入框是不能直接交互的, 需要点击之后才能输入, 这时候就需要用到 Actions 类中的一些方法

// 例如: click() , keyDown(Keys.)

// 使用这些方法运行时可能肉眼看不出效果, 我们可以加 .perform() 和 强制等待

// 使用 keyDown(Keys.Enter) 操作键盘 Enter 键时, 最好搭配其他 Alt 键一起使用, 否则可能会报错

// 不能删除原有内容

// 使用 Actions中的 DELETE, CLEAR, BACK_SPACE 清除内容失败的时候, 可以使用 CONTROL + "a"  (有时 "A" 会识别错误)选中之后输入空的字符串的方式来清空输入框

// 一般按钮用 driver 的 click() 方法更好, 输入框用 Actions.click() 更好

2.2 等待的使用

 // 在获取新界面的 URL 或者元素之前最好加一个等待, 避免因界面没有渲染完全导致获取不到元素而报错

// 在发布新帖的时候用了一次显式等待, 结果发布按钮执行太快了, 前面的输入操作来不及执行完

2.3 页面操作

// 点击方式有两种, 可以在界面定位元素后在界面实现点击, 也可以通过Action模拟鼠标点击

项目性能测试

1. 进行性能测试

 

2. 生成测试报告 

//点击查看生成的性能测试报告

 

项目总结

1. 部分使用缺陷总结

2. 测试结论与建议

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com