1.需求分析
主要对项目的一些功能以及页面的元素展示是否正确进行测试
2.测试设计
本次测试基于基于Selenium4与Junit5,对之前所作的一个小项目进行测试
3.测试执行
3.1.代码
登录页面测试:
package com.webAutoTest.Tests;
import com.webAutoTest.common.commonDriver;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;
import java.util.Set;
/**
* \* Created with IntelliJ IDEA.
* \* User: Administrator
* \* Date: 2022/11/12
* \* Time: 13:52
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class loginTest extends commonDriver {
public static ChromeDriver driver = getDriver();
//编写测试用例
/**
* 获取url
*/
@BeforeAll
static void getUrl(){
driver.get("http://114.132.153.133:8080/login.html");
}
/**
* 校验元素是否正确展示
*/
@Test
@Order(1)
void checkShow() throws IOException {
String username = driver.findElement(By.cssSelector("#body > div > div:nth-child(2) > label")).getText();
String password = driver.findElement(By.cssSelector("#body > div > div:nth-child(3) > label")).getText();
getScreenshot(getClass().getName());
//检验文本是否符合预期
Assertions.assertEquals("用户名:",username);
Assertions.assertEquals("密码:",password);
}
/**
* 测试登录功能
* @throws InterruptedException
*/
@Test
@Order(2)
void login() throws InterruptedException, IOException {
driver.findElement(By.cssSelector("#user")).sendKeys("mrzhu");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
getScreenshot(getClass().getName());
Thread.sleep(5000);
}
}
首页测试:
package com.webAutoTest.Tests;
import com.webAutoTest.common.commonDriver;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;
import java.util.Set;
/**
* \* Created with IntelliJ IDEA.
* \* User: Administrator
* \* Date: 2022/11/12
* \* Time: 14:43
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class frontPageTest extends commonDriver {
private static ChromeDriver driver = getDriver();
/**
* 跳转到首页url
*/
@BeforeAll
static void getUrl(){
driver.get("http://114.132.153.133:8080/login.html");
}
@Test
@Order(1)
void login() throws InterruptedException, IOException {
driver.findElement(By.cssSelector("#user")).sendKeys("mrzhu");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
getScreenshot(getClass().getName());
}
/**
* 查询功能
*/
@Test
@Order(2)
void inquireTest1() throws IOException {
driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("珍重");
driver.findElement(By.cssSelector("#submit1")).click();
getScreenshot(getClass().getName());
driver.findElement(By.cssSelector("#exampleInputName2")).clear();
}
@Test
@Order(3)
void inquireTest2() throws InterruptedException, IOException {
driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("");
driver.findElement(By.cssSelector("#submit1")).click();
getScreenshot(getClass().getName());
driver.findElement(By.cssSelector("#exampleInputName2")).clear();
Thread.sleep(3000);
}
/**
* 播放歌曲
*/
@Test
@Order(4)
void playTest() throws InterruptedException, IOException {
driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(4) > button")).click();
getScreenshot(getClass().getName());
Thread.sleep(3000);
}
@Test
@Order(5)
void deleteTest() throws InterruptedException, IOException {
driver.findElement(By.cssSelector("#info > tr:nth-child(3) > td:nth-child(5) > button:nth-child(1)")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
getScreenshot(getClass().getName());
}
@Test
@Order(6)
void loveMusicTest() throws InterruptedException, IOException {
driver.findElement(By.cssSelector("#info > tr:nth-child(2) > td:nth-child(5) > button:nth-child(2)")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
getScreenshot(getClass().getName());
}
//选择框选择,并删除选中的音乐
@Test
@Order(7)
void selectBoxTest() throws IOException, InterruptedException {
driver.findElement(By.xpath("//*[@id=\"41\"]")).click();
driver.findElement(By.cssSelector("#delete")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
getScreenshot(getClass().getName());
}
@Test
@Order(8)
void skipTest2() throws IOException {
//获取当前页面的句柄
String curwindow1 = driver.getWindowHandle();
driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(2)")).click();
//获取当前页面的句柄2
String curwindow2 = driver.getWindowHandle();
//获取所有页面的句柄
Set<String> allwindows = driver.getWindowHandles();
for(String window:allwindows){
if(window != curwindow1){
//跳转到该句柄(页面)
driver.switchTo().window(window);
getScreenshot(getClass().getName());
}
}
}
}
收藏音乐测试:
package com.webAutoTest.Tests;
import com.webAutoTest.common.commonDriver;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;
/**
* \* Created with IntelliJ IDEA.
* \* User: Administrator
* \* Date: 2022/11/12
* \* Time: 15:38
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class loveMusicTest extends commonDriver {
private static ChromeDriver driver = getDriver();
/**
* 跳转到首页url
*/
@BeforeAll
static void getUrl(){
driver.get("http://114.132.153.133:8080/login.html");
}
@Test
@Order(1)
void login() throws InterruptedException {
driver.findElement(By.cssSelector("#user")).sendKeys("mrzhu");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
@Test
@Order(2)
void skipLoveMusic() throws IOException {
driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(1)")).click();
getScreenshot(getClass().getName());
}
/**
* 查询功能
*/
@Test
@Order(3)
void inquireTest1() throws IOException {
driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("珍重");
driver.findElement(By.cssSelector("#submit1")).click();
getScreenshot(getClass().getName());
driver.findElement(By.cssSelector("#exampleInputName2")).clear();
}
@Test
@Order(4)
void inquireTest2() throws IOException {
driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("");
driver.findElement(By.cssSelector("#submit1")).click();
getScreenshot(getClass().getName());
driver.findElement(By.cssSelector("#exampleInputName2")).clear();
}
/**
* 播放歌曲
*/
@Test
@Order(5)
void playTest() throws InterruptedException, IOException {
driver.findElement(By.cssSelector("#info > tr > td:nth-child(3) > button")).click();
getScreenshot(getClass().getName());
Thread.sleep(3000);
}
@Test
@Order(6)
void deleteTest() throws InterruptedException, IOException {
driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(4) > button")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
getScreenshot(getClass().getName());
}
/**
* 点击按钮跳转
*/
@Test
@Order(7)
void skipTest1() throws IOException {
driver.findElement(By.cssSelector("body > div.container > div:nth-child(3) > a")).click();
getScreenshot(getClass().getName());
}
}
上传音乐测试:
package com.webAutoTest.Tests;
import com.webAutoTest.common.commonDriver;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;
/**
* \* Created with IntelliJ IDEA.
* \* User: Administrator
* \* Date: 2022/11/12
* \* Time: 15:38
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class uploadMusicTest extends commonDriver {
private static ChromeDriver driver = getDriver();
/**
* 跳转到首页url
*/
@BeforeAll
static void getUrl(){
driver.get("http://114.132.153.133:8080/login.html");
}
@Test
@Order(1)
void login() throws InterruptedException {
driver.findElement(By.cssSelector("#user")).sendKeys("mrzhu");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
Thread.sleep(2000);
driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(2)")).click();
}
//文件上传
@Test
@Order(2)
public void fileupload() throws InterruptedException, IOException {
WebElement ele = driver.findElement(By.cssSelector("body > form > input[type=file]:nth-child(1)"));
ele.sendKeys("C:\\Users\\Administrator.DESKTOP-6LVQU9V\\Music\\图片.mp3");
driver.findElement(By.cssSelector("body > form > input[type=submit]:nth-child(3)")).click();
getScreenshot(getClass().getName());
}
}
3.2.git链接
4.测试评估
与预期结果一致,全部通过测试
5.反思
- 使用注解:避免生成过多对象,造成了资源和时间的浪费。
- 通过static修饰静态变量,全局只创建一次驱动对象,避免重复创建驱动对象造成时间的浪费。
- 使用参数化:保持用例的简洁,提高了代码的可读性。
- 使用测试套件:一次执行所有我们想要运行的自动化用例。
- 使用等待(隐式等待+强制等待):提高自动化指定的稳定性。-----降低自动化出现误报的概率
- 使用屏幕截图:方便问题的追溯和问题的解决。
虽然看着简单,由于初学,这个东西也花费几乎一天时间,主要是调试错误,寻找bug浪费了时间。坐到我脊椎都疼了…该休息了…