目录
对慕课网的登录流程进行脚本设计与重构,下面开始学习吧!
1.登录功能脚本设计
对登录功能进行简单的冒烟测试,设计测试用例,并编写自动化测试脚本。
测试用例如下:
编写脚本使用的是TestNG框架,所以需要在pom.xml中引入TestNG的依赖jar包,引入的方式参考:Maven的安装与配置并创建Maven项目
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.6</version>
<scope>test</scope>
</dependency>
自动化脚本如下:
package com.imooc.day01;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
/**
* 登录脚本
*
* @author HW
* @version V1.0
*
*/
public class UserLoginTest1 {
public WebDriver driver;
@BeforeTest
public void beforeTest() {
// 指定chromedriver驱动的路径并实例化浏览器
System.setProperty("webdriver.chrome.driver",
"C:\\Users\\HW\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe");
driver = new ChromeDriver();
String baseUrl = "https://www.imooc.com/";
driver.get(baseUrl);
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
}
@Test
public void testUserLogin() throws InterruptedException {
// 点击"登录"按钮
driver.findElement(By.id("js-signin-btn")).click();
// 在登录框输入正确的用户名和密码
driver.findElement(By.name("email")).sendKeys("mushishi_xu@163.com");
driver.findElement(By.name("password")).sendKeys("xu221168");
// 点击登录框的"登录"按钮
driver.findElement(By.className("moco-btn")).click();
// 模拟鼠标悬停操作
Actions action = new Actions(driver);
action.moveToElement(driver.findElement(By.id("header-avator"))).perform();
String nickname = driver.findElement(By.className("text-ellipsis")).getText();
if (nickname.equals("mushishi_xu")) {
System.out.println("登录成功!");
} else {
System.out.println("用户信息不匹配!");
}
// 点击"安全退出"链接
driver.findElement(By.linkText("安全退出")).click();
}
@AfterTest
public void afterTest() {
// 关闭浏览器
driver.close();
}
}
2.对登录脚本进行重构--封装By
2.1 什么是重构?
重构就是通过调整程序代码,但并不改变程序的功能特性,达到改善软件的质量、性能,使程序的设计模式和架构更趋合理,更容易被理解,提高软件的可扩展性和维护性。
2.2 为什么要进行重构?
- 改进软件设计
- 更容易理解
- 提高效率
2.3 封装By
思路:创建一个方法,包含两个参数,分别用于接收元素的定位方式与定位方式对应的值,然后使用if…else语句判断元素属于哪种定位方式!
部分代码如下:
@Test
public void testUserLogin() throws InterruptedException {
// 点击"登录"按钮
driver.findElement(getByLocator("id", "js-signin-btn")).click();
// 在登录框输入正确的用户名和密码
driver.findElement(getByLocator("name", "email")).sendKeys("mushishi_xu@163.com");
driver.findElement(getByLocator("name", "password")).sendKeys("xu221168");
// 点击登录框的"登录"按钮
driver.findElement(getByLocator("className", "moco-btn")).click();
Actions action = new Actions(driver);
action.moveToElement(driver.findElement(getByLocator("id", "header-avator"))).perform();
String nickname = driver.findElement(getByLocator("className", "text-ellipsis")).getText();
if (nickname.equals("mushishi_xu")) {
System.out.println("登录成功!");
} else {
System.out.println("用户信息不匹配!");
}
// 点击"安全退出"链接
driver.findElement(getByLocator("linkText", "安全退出")).click();
}
/**
* 封装By
*
* @param locatorType 定位方式
* @param locatorValue 定位方式对应的值
* @return
*/
public By getByLocator(String locatorType, String locatorValue) {
if (locatorType.equals("id")) {
return By.id(locatorValue);
} else if (locatorType.equals("name")) {
return By.name(locatorValue);
} else if (locatorType.equals("className")) {
return By.className(locatorValue);
} else if (locatorType.equals("linkText")) {
return By.linkText(locatorValue);
} else if (locatorType.equals("cssSelector")) {
return By.xpath(locatorValue);
} else if (locatorType.equals("xpath")) {
return By.xpath(locatorValue);
} else {
return By.tagName(locatorValue);
}
}
3.如何读取properties配置文件
当页面元素有改动的时候,例如本文的元素的定位方式或定位方式对应的值出现改动,就需要修改多处代码,可维护性差!因此可以把页面元素提取出来,放到一个单独的properties文件里,通过配置文件来读取,当页面元素出现了改动,就可以直接修改配置文件的内容,而不用改动代码!
3.1 element.properties文件
3.2 写一个工具类,来读取配置文件的内容
package com.imooc.day01;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 读取配置文件的工具类
*
* @auth