Java Selenium学习笔记(十三):登录脚本重构

这篇博客详述了使用Java Selenium进行登录功能的脚本设计与重构,包括封装By、读取properties配置文件、登录账号参数化以及实现登录失败自动截图。通过重构提高代码可维护性和效率,介绍了如何处理元素定位、读取配置文件内容以及测试用例设计。此外,还讨论了TestNG框架中实现失败自动截图的监听器类。
摘要由CSDN通过智能技术生成

目录

1.登录功能脚本设计

2.对登录脚本进行重构--封装By

2.1 什么是重构?

2.2 为什么要进行重构? 

2.3 封装By

3.如何读取properties配置文件

3.1 element.properties文件

3.2 写一个工具类,来读取配置文件的内容

3.3 对读取配置文件的方法进行重构

4.登录账号参数化

4.1 需求

4.2 设计测试用例

4.3 user.properties文件

4.4 修改读取配置文件的工具类

 4.5 代码

4.6 遇到的问题

4.7 Debug调试,在哪里设置断点?

5.登录失败自动截图

6.TestNG实现失败自动截图


对慕课网的登录流程进行脚本设计与重构,下面开始学习吧!

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蝌蚪找玛玛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值