目录
博客系统项目地址:http://47.121.28.16:8080/login.html
1、使用脑图编写博客系统测试用例
2、创建好Maven项目
pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>BlogTest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.7.1</version>
</dependency>
<!-- 保存屏幕截图文件需要用到的包 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3、整体架构
4、书写代创建驱动工具类
package webAutoTest.common;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.time.Duration;
public class AutotestUtils {
public static ChromeDriver driver;
//创建驱动
public static ChromeDriver createDriver() {
if (driver == null) {
System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
driver = new ChromeDriver(options);
// 隐式等待一下,让页面渲染完成,防止找不到页面中的元素
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
System.out.println("隐式等待让页面渲染完毕!");
}
return driver;
}
}
驱动工具类便于后续创建驱动。
5、注册页面自动化测试
package webAutoTest.logined_tests;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
import java.io.File;
import java.io.IOException;
/**
* 注册界面的自动化测试
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前该类下面的测试方法要按一定的顺序执行
public class regTest extends AutotestUtils { // 继承用于隐式等待的公共方法
public static ChromeDriver driver = createDriver();
@Test // @Test说明方法 是测试方法,执行当前这个类时,会自动的执行该类下的所有带@Test注解的用例
@BeforeAll // 带有BeforeAll注解的方法会在当前类下的所有测试用例之前(方法)执行一次,注意只是执行一次
public static void init() {
// 既然是对注册界面的测试,自然要先跳转到该界面
driver.get("http://47.121.28.16:8080/reg.html");
}
/**
* 对页面内容的完整性进行测试
*/
@Test
@Order(1)
public void regPageTest() {
// 利用断言验证页面显示的文本是否正确
String expect = "注册";
String actual = driver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText();
Assertions.assertEquals(expect, actual); // 如果不正确
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")); // 检查博客登录页的主页超链接是否存在
// 检查提交按钮是否存在
driver.findElement(By.cssSelector("#submit"));
}
/**
* 正常注册
*/
@ParameterizedTest // 多参数——加了该注解就不用@Test了
@Order(2)
@CsvSource({"ABCDEFG, 123456, 123456"}) // 多参数
public void regRightTest(String username, String password, String password2) throws InterruptedException, IOException {
// 每次都要提前把之前输入框的内容给清除(不管有没有内容)
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#password2")).clear();
// 将信息填入输入框
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
// 找到提交按钮,并点击提交
driver.findElement(By.cssSelector("#submit")).click();
// 强制等待,让弹窗显示出来(避免我们页面还没加载完成,我们下面的代码就尝试获取弹窗
Thread.sleep(500);
// 注册成功后,会出现弹窗,获取弹窗并且关闭
Alert alert = driver.switchTo().alert();
alert.accept(); // 点击弹窗中的确定,以便让程序继续执行下去
// 注册成功后,应该会跳转到登录页面
Thread.sleep(100);
String expectURL = "http://47.121.28.16:8080/login.html";
String actualURL = driver.getCurrentUrl(); // 获取当前页面的URL 与登录页面url进行对比
Assertions.assertEquals(expectURL, actualURL);
// 获取此时的屏幕截图,此时应该以及跳转到了登录页面
File srcFile = driver.getScreenshotAs(OutputType.FILE);
String fileName = "regRightTest.png";
FileUtils.copyFile(srcFile, new File(fileName));
// 因为注册成功会跳转到登录界面,所以但接下来我们还有在注册界面测试,所以要回退到注册界面
driver.navigate().back();
Thread.sleep(1000);//停留1s给下个测试缓冲
}
/**
* 测试注册失败的情况
* (admin这个用户名我以及注册过了再次注册,由于用户名的唯一约束,会导致注册失败)
* (前后两次输入的密码不一致)
*/
@ParameterizedTest
@Order(3)
@CsvSource({ "力量, 123, 123456"})
public void regFailTest(String username, String password, String password2) throws InterruptedException {
// 每次输入信息前, 先要清除输入框的原有内容
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#password2")).clear();
// 往输入框中输入数据
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
Thread.sleep(100);
driver.findElement(By.cssSelector("#submit")).click();
// 等待弹窗加载完成
Thread.sleep(1000);
Alert alert = driver.switchTo().alert(); // 获取弹窗
String expect = "两次密码输入不一致!请重新输入!";
String acutal = alert.getText();
alert.accept();
Assertions.assertEquals(expect, acutal);//看浏览器的实际弹窗内容是否和我们预期的一样
}
/**
* 关闭注册弹窗
*/
@Test
@AfterAll // 带有AfterAll注解的方法会在当前类下的所有测试用例(方法)执行之后 执行一次,注意只是执行一次
public static void close() {
driver.quit();
}
}
6、登录页面自动化测试
package webAutoTest.logined_tests;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
import org.openqa.selenium.OutputType;
import java.io.File;
import java.io.IOException;
import java.time.Duration;
/**
* 登录页面的自动化测试
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前该类下面的测试方法要按一定的顺序执行
public class loginTest extends AutotestUtils {
public static ChromeDriver driver = createDriver();
@Test
@BeforeAll // 被@BeforeAll修饰的方法要是静态的
static void init() {
driver = createDriver();
// 跳转到博客登录页面
driver.get("http://47.121.28.16:8080/login.html");
}
/**
* 检查登录页面是否正常显示
* @throws InterruptedException
*/
@Test
@Order(1)
void loginPageTest() throws InterruptedException {
// 隐式等待--// 隐式等待,更加丝滑——》作用于下面的整个作用领域,这个方法中的所有元素,在这3秒内不断轮询
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
// 利用断言判断登录的文本内容显示是否正确
String expect = "登陆";
String actual = driver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText(); // 检查登录页面的登录文本是否存在
Assertions.assertEquals(expect, actual);
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")); // 检查博客注册页的主页超链接是否存在
// 检查提交按钮是否存在
driver.findElement(By.cssSelector("#submit"));
}
/**
* 检查登录失败的情况
*/
@Order(2)
@ParameterizedTest // 多个参数
@CsvSource({"admin, 123"})
void loginFailTest(String username, String password) throws IOException, InterruptedException {
// 把之前默认填充内容清空
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(password);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
System.out.println(alert.getText());
alert.accept();
}
/**
* 检查正常登录的情况,每写一个测试用例就测试一下
*/
@ParameterizedTest // 写了该注解就不用在写@Test注解了(多参数)
@Order(3)
@CsvSource({"土狗, 123456", "admin, 123456"})
void loginRightTest(String username, String password) throws InterruptedException, IOException {
// 多个账号登录,在重新输入账号时,需要把之前的输入的内容清空
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(password);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
alert.accept(); // 选择确认
// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到我的博客列表页
String expect = "http://47.121.28.16:8080/myblog_list.html";
String actual = driver.getCurrentUrl();
Assertions.assertEquals(expect, actual); // 查看当前的url是否在博客详情页面
// 进行截图,看当前是否跳转到了登录界面
// 程序执行的速度和页面渲染的速度
File srcFile = driver.getScreenshotAs(OutputType.FILE);
String fileName = "loginRightTest.png";
FileUtils.copyFile(srcFile, new File(fileName));
//因为我们要测试多个账号,所有在一个账号检测完了后,还需要回退到登录界面
driver.navigate().back();
System.out.println(driver.getCurrentUrl());
}
// 这里我们不关闭driver驱动,因为我们要保证登录状态
}
7、我的博客列表页自动化测试
package webAutoTest.logined_tests;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
import java.io.File;
import java.io.IOException;
/**
* 用户已经登录的情况下,对个人主页进行测试
*/
public class myBlogListTest extends AutotestUtils {
public static ChromeDriver driver = createDriver();
// 先到登录页面
@Test
@BeforeAll
static void init() {
driver = createDriver();
driver.get("http://47.121.28.16:8080/login.html");
}
//先进行登录
@ParameterizedTest // 写了该注解就不用在写@Test注解了(多参数)
@Order(1)
@CsvSource({"admin, 123456"})
void loginRightTest(String username, String password) throws InterruptedException, IOException {
// 多个账号登录,在重新输入账号时,需要把之前的输入的内容清空
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(password);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
alert.accept(); // 选择确认
// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到我的博客列表页
String expect = "http://47.121.28.16:8080/myblog_list.html";
String actual = driver.getCurrentUrl();
Assertions.assertEquals(expect, actual); // 查看当前的url是否在我的博客列表页面
}
@Test
@Order(2)
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.nav > a:nth-child(6)"));
//是否找到写博客
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));
// 测试删除博客按钮是否存在(文本显示是否正确)
String expect1 = "删除 >>";
String actual1 = driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > a:nth-child(6)")).getText();
Assertions.assertEquals(expect1, actual1);
// 测试修改博客按钮是否存在(文本显示是否正确)
String expect2 = "修改 >>";
String actual2 = driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > a:nth-child(5)")).getText();
Assertions.assertEquals(expect2, actual2);
String expect3 = "查看全文 >>";
String actual3 = driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > a:nth-child(4)")).getText();
Assertions.assertEquals(expect1, actual1);
}
}
8、 主页(总博客列表页)自动化测试
package webAutoTest.logined_tests;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
import java.io.File;
import java.io.IOException;
/**
* 用户登录状态下的博客列表测试
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前类中的测试方法要按一定的顺序来执行---和order配合使用
public class blogListTest extends AutotestUtils {
public static ChromeDriver driver = createDriver();
// 先到登录页面
@Test
@BeforeAll
static void init() {
driver = createDriver();
driver.get("http://47.121.28.16:8080/login.html");
}
//进行登录
@ParameterizedTest // 写了该注解就不用在写@Test注解了(多参数)
@Order(1)
@CsvSource({"admin, 123456"})
void loginRightTest(String username, String password) throws InterruptedException, IOException {
// 多个账号登录,在重新输入账号时,需要把之前的输入的内容清空
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(password);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
alert.accept(); // 选择确认
// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到我的博客列表页
String expect = "http://47.121.28.16:8080/myblog_list.html";
String actual = driver.getCurrentUrl();
Assertions.assertEquals(expect, actual); // 查看当前的url是否在我的博客列表页面
}
/**
* 测试总的博客列表页面的完整性
*/
@Test
@Order(2)
void pageTest() throws InterruptedException { // 不能用private修饰该方法——》我们的selenium还要调用该方法
//点击我的博客列表页的主页按钮进行跳转到主页
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
Thread.sleep(300);
// 看看是否能够获取到博客列表页面的翻页按钮(只有总的博客列表页有,个人主页没有)
driver.findElement(By.cssSelector("#pageDiv > button:nth-child(1)"));//翻页的首页按钮。找到就说明在总博客页
// 查看页面的文本内容显示是否正确
String expect = "selenium常用API的使用";
String actual = driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > div.title")).getText();
Assertions.assertEquals(expect, actual); // 断言
// 查看是否有个人主页的超链接并进行跳转
driver.findElement(By.cssSelector("#isLoginElement > a:nth-child(1)")).click();
String expectURL = "http://47.121.28.16:8080/myblog_list.html";
String actualURL = driver.getCurrentUrl().substring(0, 41);
// 利用断言看:在登录成功的情况下,界面是否跳转到了个人主页
Assertions.assertEquals(expectURL, actualURL);
}
}
9、文章详情页自动化测试
package webAutoTest.logined_tests;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
import java.io.IOException;
/**
* 用户已经登录的状态下,对博客详情页进行测试
*/
public class blogDetailTest extends AutotestUtils {
public static ChromeDriver driver = createDriver();
// 先到登录页面
@Test
@BeforeAll
static void init() {
driver = createDriver();
driver.get("http://47.121.28.16:8080/login.html");
}
//进行登录
@ParameterizedTest // 写了该注解就不用在写@Test注解了(多参数)
@Order(1)
@CsvSource({"admin, 123456"})
void loginRightTest(String username, String password) throws InterruptedException, IOException {
// 多个账号登录,在重新输入账号时,需要把之前的输入的内容清空
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(password);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
alert.accept(); // 选择确认
// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到我的博客列表页
String expect = "http://47.121.28.16:8080/myblog_list.html";
String actual = driver.getCurrentUrl();
Assertions.assertEquals(expect, actual); // 查看当前的url是否在我的博客列表页面
}
/**
* 测试主页的标题是否和详情页一致
* @throws InterruptedException
*/
@Test
@Order(2)
void pageTest() throws InterruptedException {
//登录后点击主页到总博客列表页
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
Thread.sleep(300);
//获取到第一篇文章的标题,为后续进入详情页对比标题做准备、
String expect=driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > div.title")).getText();
//点击第一篇文章的查看详情,跳转到博客详情页
driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > a")).click();
Thread.sleep(300);
//获取当前文章标题与前面的标题进行对比
String actual=driver.findElement(By.cssSelector("#title")).getText();
//利用断言
Assertions.assertEquals(expect, actual);
}
/**
* 测试详情页的右侧作者名是否和标题下的一致和测试详情页的各个超链接是否存在
* @throws InterruptedException
*/
@Test
@Order(3)
void pageTest2() throws InterruptedException {
//测试右侧的作者名与标题下的作者名是否一致
//右侧作者名
String expect=driver.findElement(By.cssSelector("#auther2")).getText();
//左侧作者名
String actual=driver.findElement(By.cssSelector("#auther")).getText();
Assertions.assertEquals(expect, actual);
//是否可以找到主页、写博客、注销按钮
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));//主页
driver.findElement(By.cssSelector("#isLoginElement > a:nth-child(1)"));//写博客
driver.findElement(By.cssSelector("#isLoginElement > a:nth-child(2)"));//注销
}
}
10、主页和文章详情页未登录状态测试
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 =createDriver();
@Test
@BeforeAll
static void init() {
driver.get("http://47.121.28.16:8080/blog_list.html");
}
/**
* 测试总的博客列表页面的完整性
*/
@Test
@Order(1)
void pageTest() throws InterruptedException { // 不能用private修饰该方法——》我们的selenium还要调用该方法
// 看看是否能够获取到博客列表页面的翻页按钮(只有总的博客列表页有,个人主页没有)
driver.findElement(By.cssSelector("#pageDiv > button:nth-child(1)"));//翻页的首页按钮。找到就说明在总博客页
// 查看页面的文本内容显示是否正确
String expect = "测试开发实战2";
String actual = driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > div.title")).getText();
Assertions.assertEquals(expect, actual); // 断言
//查看是否有登录按钮
driver.findElement(By.cssSelector("#noLoginElement"));
//点击查看全文跳转到详情页
driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > a")).click();
//文章标题为测试开发实战2
String expect2="测试开发实战2";
String result=driver.findElement(By.cssSelector("#title")).getText();
Assertions.assertEquals(expect, actual); // 断言
}
@Test
@AfterAll
static void exit() {
driver.quit();
}
}
11、博客编辑页(写博客) 自动化测试
package webAutoTest.logined_tests;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
import java.io.IOException;
/**
* 用户已经登录的情况下,对博客编辑页进行测试
*/
public class blogEditTest extends AutotestUtils {
public static ChromeDriver driver = createDriver();
// 先到登录页面
@Test
@BeforeAll
static void init() {
driver = createDriver();
driver.get("http://47.121.28.16:8080/login.html");
}
//进行登录
@ParameterizedTest // 写了该注解就不用在写@Test注解了(多参数)
@Order(1)
@CsvSource({"admin, 123456"})
void loginRightTest(String username, String password) throws InterruptedException, IOException {
// 多个账号登录,在重新输入账号时,需要把之前的输入的内容清空
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(password);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
alert.accept(); // 选择确认
// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到我的博客列表页
String expect = "http://47.121.28.16:8080/myblog_list.html";
String actual = driver.getCurrentUrl();
Assertions.assertEquals(expect, actual); // 查看当前的url是否在我的博客列表页面
}
@Test
@Order(2)
void pageTest() throws InterruptedException {
//先点击写博客进入写博客的页面
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
Thread.sleep(300);
// 测试是否能够找到博客编辑页的发布按钮
driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button"));
// 测试是否能够找到博客编辑页的主页按钮
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));
//测试是否能够找到博客编辑页的注销按钮
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));
// 在博客标题中输入内容
driver.findElement(By.cssSelector("#title")).sendKeys("测试开发实战");
// 在博客内容中输入内容,因为我们这里使用了第三方的插件,所以我们不能直接通过sendkeys来输入内容(直接使用默认的内容即可)
Thread.sleep(1000);
driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click(); // 点击发布按钮
// 如果发布成功,会出现一个弹窗——》提示发布成功
Thread.sleep(100); // 等待弹窗出现
Alert alert = driver.switchTo().alert();
alert.dismiss();//关闭弹窗(点取消键)
Thread.sleep(1000);
// 页面会跳到我们的博客列表页面,在博客列表页的第一个一个元素看是否能够找到我们刚刚提交的数据
String actual =driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > div.title")).getText();
Thread.sleep(1000);
String expect = "测试开发实战";
Assertions.assertEquals(expect, actual);
}
}
12、博客修改页自动化测试
package webAutoTest.logined_tests;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
import java.io.IOException;
/**
* 用户登录状态下对博客修改页面进行测试
*/
public class blogUpdateTest extends AutotestUtils {
public static ChromeDriver driver = createDriver();
// 先到登录页面
@Test
@BeforeAll
static void init() {
driver = createDriver();
driver.get("http://47.121.28.16:8080/login.html");
}
//进行登录
@ParameterizedTest // 写了该注解就不用在写@Test注解了(多参数)
@Order(1)
@CsvSource({"admin, 123456"})
void loginRightTest(String username, String password) throws InterruptedException, IOException {
// 多个账号登录,在重新输入账号时,需要把之前的输入的内容清空
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(password);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(100);
Alert alert = driver.switchTo().alert();
alert.accept(); // 选择确认
// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到我的博客列表页
String expect = "http://47.121.28.16:8080/myblog_list.html";
String actual = driver.getCurrentUrl();
Assertions.assertEquals(expect, actual); // 查看当前的url是否在我的博客列表页面
}
@Test
@Order(2)
void pageTest() throws InterruptedException {
// 查看修改博客和删除博客按钮是否存在
driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > a:nth-child(6)"));//删除按钮
driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > a:nth-child(5)"));//修改按钮
//点击修改按钮进入修改页面
driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > a:nth-child(5)")).click();
// 查看修改页面博客标题是否存在
driver.findElement(By.cssSelector("#title"));
//将标题改为测试开发实战2并进行发布
//先清空标题
driver.findElement(By.cssSelector("#title")).clear();
Thread.sleep(300);
//再写测试开发实战2
driver.findElement(By.cssSelector("#title")).sendKeys("测试开发实战2");
Thread.sleep(300);
driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click(); // 点击发布按钮
// 如果发布成功,会出现一个弹窗——》提示发布成功
Thread.sleep(100); // 等待弹窗出现
Alert alert = driver.switchTo().alert();
alert.dismiss();//关闭弹窗(点取消键)
Thread.sleep(1000);
// 页面会跳到我们的博客列表页面,在博客列表页的第一个一个元素看是否能够找到我们刚刚提交的数据
String actual =driver.findElement(By.cssSelector("#articlelist > div:nth-child(1) > div.title")).getText();
Thread.sleep(1000);
String expect = "测试开发实战2";
Assertions.assertEquals(expect, actual);
}
// @Test
// @AfterAll
// static void exit() {
// driver.quit();
// }
}