四、博客列表页测试
首先对于博客列表页面来说,分为登录情况下的测试和未登录情况下的测试
登录情况下的测试
package webAutoTest.logined_tests; import org.junit.jupiter.api.*; import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver; import webAutoTest.common.AutotestUtils; /** * 用户登录状态下的博客列表测试 */ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前类中的测试方法要按一定的顺序来执行---和order配合使用 public class blogListTest extends AutotestUtils { private static ChromeDriver driver = new ChromeDriver(); @Test @BeforeAll static void init() { driver.get("http://49.235.66.46:9000/blog_list.html"); } /** * 测试总的博客列表页面的完整性 */ @Test @Order(1) void pageTest() { // 不能用private修饰该方法——》我们的selenium还要调用该方法 // 看看是否能够获取到博客列表页面的翻页按钮(只有总的博客列表页有,个人主页也没有) driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)")); // 查看页面的文本内容显示是否正确 String expect = "Linux删除文件操作"; String actual = driver.findElement(By.cssSelector("body > div.container > div > div:nth-child(2) > div.title")).getText(); Assertions.assertEquals(expect, actual); // 断言 // 查看是否有个人主页的超链接 driver.findElement(By.cssSelector("#myblog")).click(); String expectURL = "http://49.235.66.46:9000/myblog_list.html"; String actualURL = driver.getCurrentUrl(); // 利用断言看:在登录成功的情况下,界面是否跳转到了个人主页 Assertions.assertEquals(expectURL, actualURL); } @Test @AfterAll static void exit() { driver.quit(); } }
未登录情况下的测试
package webAutoTest.unlogined_tests; import org.junit.jupiter.api.*; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver; import webAutoTest.common.AutotestUtils; /** * 用户未登录状态下的博客列表测试 */ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前类中的测试方法要按一定的顺序来执行---和order配合使用 public class blogListTest extends AutotestUtils { private static ChromeDriver driver = new ChromeDriver(); @Test @BeforeAll static void init() { driver.get("http://49.235.66.46:9000/blog_list.html"); } /** * 测试总的博客列表页面的完整性 */ @Test @Order(1) void pageTest() throws InterruptedException { // 不能用private修饰该方法——》我们的selenium还要调用该方法 // 看看是否能够获取到博客列表页面的翻页按钮(只有总的博客列表页有,个人主页也没有) driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)")); // 查看页面的文本内容显示是否正确 String expect = "Linux删除文件操作"; String actual = driver.findElement(By.cssSelector("body > div.container > div > div:nth-child(2) > div.title")).getText(); Assertions.assertEquals(expect, actual); // 断言 // 查看是否有个人主页的超链接 driver.findElement(By.cssSelector("#myblog")).click(); Thread.sleep(100); // 强制等待弹窗的出现(隐式等待无法处理弹窗/显示等待和隐式等待尽量不共存) // 在未登录的情况下,页面跳转到个人主页是否会出现弹窗(以及弹窗内容是否和我们预期的一致) Alert alert = driver.switchTo().alert(); String expectAlert = "当前用户未登录,你即将跳转到登录页面"; String actualAlert = alert.getText(); Assertions.assertEquals(expectAlert, actualAlert); // 不要忘了关闭弹窗 alert.accept(); } @Test @AfterAll static void exit() { driver.quit(); } }
一些问题,在实际测试的时候,我发现当用private修饰测试方法时
这是因为private修改的方法只在当前类中可见,外部类不可见。
但是我们是借助selenium来进行自动化测试,那么这样一来,selenium就调用不了这个测试方法了————》当然也就执行不了测试用例了。
五、博客详情页测试
用户已登录的情况下测试
package webAutoTest.logined_tests; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import webAutoTest.common.AutotestUtils; /** * 用户已经登录的状态下,对博客详情页进行测试 */ public class blogDetailTest extends AutotestUtils { // 这里我们不重新生成驱动,我们用的还是登录界面的驱动,因为我们要保留登录状态 @Test @BeforeAll static void init() { driver.get("http://49.235.66.46:9000/blog_content.html?id=2"); } @Test void pageTest() { // 测试左侧信息框中的用户名是否能正常显示 driver.findElement(By.cssSelector("body > div.container > div.container-left > div > h3")); // 测试删除博客按钮是否存在(文本显示是否正确) String expect1 = "删除博客"; String actual1 = driver.findElement(By.cssSelector("body > div.nav > a.del")).getText(); Assertions.assertEquals(expect1, actual1); // 测试修改博客按钮是否存在(文本显示是否正确) String expect2 = "修改博客"; String actual2 = driver.findElement(By.cssSelector("body > div.nav > a.update")).getText(); Assertions.assertEquals(expect2, actual2); } @Test @AfterAll static void exit() { driver.quit(); } }
测试视频
我们通过测试套件可以同时执行多个类的测试用例
用户未登录的情况下测试
package webAutoTest.unlogined_tests; import org.checkerframework.checker.units.qual.A; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver; /** * 用户登录的状态下,对博客详情页进行测试 */ public class blogDetailTest { static ChromeDriver driver = new ChromeDriver(); @Test @BeforeAll static void init() { driver.get("http://49.235.66.46:9000/blog_content.html?id=2"); } @Test void pageTest() throws InterruptedException { // 未登录状态下,可以访问博客详情页,但不可以进行删除博客、修改博客的操作 driver.findElement(By.cssSelector("body > div.nav > a.update")).click(); // 点击删除博客,应该会出现-----是否要删除该博客的弹窗,点击确定 Thread.sleep(300); Alert alert1 = driver.switchTo().alert(); // 点击完——确定要删除该博客——》在未登录状态,会出现下一个弹窗 String expect = "当前用户未登录,你即将跳转到登录页面"; String actual = alert1.getText(); alert1.accept(); Assertions.assertEquals(expect,actual); } @Test @AfterAll static void quit() { driver.quit(); } }
六、个人主页测试
package webAutoTest.logined_tests; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import webAutoTest.common.AutotestUtils; public class myBlogListTest extends AutotestUtils { @Test @BeforeAll static void init() { driver.get("http://49.235.66.46:9000/myblog_list.html?uid=2"); } @Test void pageTest() { // 测试是否存在博客列表页的超链接(以及该超链接所显示的文本是否正确,只有在个人主页该超链接的文本才是“首页”这两个字) String expect = "首页"; String actual = driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText(); Assertions.assertEquals(expect, actual); // 是否能找到个人信息栏 driver.findElement(By.cssSelector("body > div.container > div.container-left > div > h3")); } @Test @AfterAll static void exit() { driver.quit(); } }
七、博客编辑页面测试
package webAutoTest.logined_tests; import org.checkerframework.checker.units.qual.A; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import webAutoTest.common.AutotestUtils; import javax.swing.tree.TreeNode; /** * 用户已经登录的情况下,对博客编辑页进行测试 */ public class blogEditTest extends AutotestUtils { // 这里我们不重新生成驱动,我们用的还是登录界面的驱动,因为我们要保留登录状态 @Test @BeforeAll static void init() { driver.get("http://49.235.66.46:9000/blog_edit.html"); } @Test void pageTest() throws InterruptedException { // 测试是否能够找到博客编辑页的提示按钮 driver.findElement(By.cssSelector("#submit")); // 测试是否能够找到对应页面的超链接 driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")); // 在博客标题中输入内容 driver.findElement(By.cssSelector("#title")).sendKeys("测试开发实战"); // 在博客内容中输入内容,因为我们这里使用了第三方的插件,所以我们不能直接通过sendkeys来输入内容(但我们可以通过click点击事件,往模块内容中插入横线等(本身插件提供的元素) driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click(); Thread.sleep(100); driver.findElement(By.cssSelector("#submit")).click(); // 点击提交 // 如果发布成功,会出现一个弹窗——》提示发布成功 Thread.sleep(100); // 等待弹窗出现 Alert alert = driver.switchTo().alert(); alert.accept(); // 页面会跳到我们的总的博客列表页面,在博客列表页的最后一个元素看是否能够找到我们刚刚提交的数据 // 1、到博客列表的末页 driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)")).click(); Thread.sleep(100); String expect = "测试开发实战"; String actual = driver.findElement(By.xpath("/html/body/div[2]/div/div[last()]/div[1]")).getText(); // 获取该页中最后一个title标签,通过last() Assertions.assertEquals(expect, actual); } @Test @AfterAll static void exit() { driver.quit(); } }
其中在检测新增的博客是否添加成功的时候,因为新添加的博客自动就添加到了总的博客列表的末尾,因此:
1、通过博客列表的末页标签,跳转到博客列表的最后一页。
2、通过xpath的
/html/body/div[2]/div/div[last()]/div[1]
定位到当前页面的最后一个title标签,其中last()保障了当前界面有几个博客标题,我们获取到的都是最后一个标题(最新的那个,也就是刚刚我们发表的那个)
3、找到对应博客的标题元素后,看文本内容是否和我们编辑时候输入的文章标题一致
八、博客修改页面测试
package webAutoTest.logined_tests; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import webAutoTest.common.AutotestUtils; /** * 用户登录状态下对博客修改页面进行测试 */ public class blogUpdateTest extends AutotestUtils { @Test @BeforeAll static void init() { driver.get("http://49.235.66.46:9000/blog_content.html?id=17"); } @Test void pageTest() { // 查看博客标题是否存在 driver.findElement(By.cssSelector("body > div.container > div.container-right > div > h3")); // 查看修改博客和删除博客按钮是否存在 driver.findElement(By.cssSelector("body > div.nav > a.del")); driver.findElement(By.cssSelector("body > div.nav > a.update")); } @Test @AfterAll static void exit() { driver.quit(); } }
九、总结
总测试视频
总代码
gitee: 博客系统的web自动化测试——完整代码