testNG的具体使用+selenium框架面试实战

一、testng具体使用

案例一

package selenium.testCase;

import org.testng.annotations.*;

/**
 * @Auther: ljm
 * @Date: 2021/09/26/17:01
 * @Description:
 */
public class testngTest {

    @BeforeClass
    public void test01(){
        System.out.println("@BeforeClass====test01");
    }
    @BeforeMethod
    public void test02(){
        System.out.println(" @BeforeMethod====test02");
    }

    @AfterMethod
    public void test03(){
        System.out.println("@AfterMethod====test03");
    }

    @Test
    public void test(){
        System.out.println("@Test====test");
    }

    @Test
    public void test8(){
        System.out.println("@Test====test8");
    }


    @AfterClass
    public void test04(){
        System.out.println("@AfterClass====test04");
    }
}

结果:
在这里插入图片描述

testNG参数化

配置IDEA中testng.xml文件

testng标签含义

配置账号密码和我们需要做的事情
testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite"><test verbose="2" preserve-order="true" name="E:/cxzr_java_seleium/src/test/java/selenium">
    <parameter name="username" value="130818****"/>
    <parameter name="password" value="*****"/>

    <classes>
        <class name="selenium.testCase.SuiteTestLogin">
        <methods>
            <include name="testLogin"/>
        </methods>
        </class>
        <class name="selenium.testCase.login">
        <methods>
            <include name="getLoginHome"/>
        </methods>
        </class>
<!--        <class name="selenium.testCase.testCourseList">-->
<!--        <methods>-->
<!--            <include name="CourseList"/>-->
<!--        </methods>-->
<!--        </class>-->
<!--        <class name="selenium.testCase.testngTest">-->
<!--            <methods><include name="test"/>-->
<!--                <include name="test8"/>-->
<!--                <include name="test04"/>-->
<!--            </methods>-->
<!--        </class>-->
    </classes>
</test>
</suite>

src/test/java/selenium/testCase/login.java

    @Test
    public void getLoginHome(){
        driver.get("http://www.imooc.com");
        driver.max();
        driver.findElement(By.id("js-signin-btn")).click();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //testng参数化
    @Test(dependsOnMethods = {"getLoginHome"})
    @Parameters({"username","password"})
    public void testLogin(String username, String password) {
        loginPro.login(username,password);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

右键运行testng.xml即可看到test的运行结果

企业中case运用登陆

在企业生产中case关联性尽量少用依赖
应该是一条case一条的写
登陆测试
判断登陆是否成功,就是看登陆名是否正确来确定
src/test/java/com/mushishi/selenium/testCase/SuiteTestLogin.java
里面用到了HomePagePro这个类需要对其进行函数构造AssertLogin方法

package com.mushishi.selenium.testCase;

import java.util.concurrent.TimeUnit;

import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.mushishi.selenium.base.DriverBase;
import com.mushishi.selenium.business.HomePagePro;
import com.mushishi.selenium.business.LoginPro;
import com.mushishi.selenium.util.HandleCookie;
import com.mushishi.selenium.util.ProUtil;

public class SuiteTestLogin extends CaseBase{
	public DriverBase driver;
	public LoginPro loginpro;
	public HomePagePro homepagepro;
	public ProUtil pro;
	public HandleCookie handcookie;
	
	@BeforeClass
	public void beforeClass(){
		this.driver = InitDriver("chrome");
		pro = new ProUtil("loginTest.properties");
		//等待时间
		driver.driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
		loginpro = new LoginPro(driver);
		handcookie = new HandleCookie(driver);
		homepagepro = new HomePagePro(driver);
		driver.get(pro.getPro("url"));
	}
	@Test
	public void testLogin(){
		String username = pro.getPro("username");
		String password = pro.getPro("passwd");
		loginpro.login(username, password);
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//判断是不是相等,很类似于springboot中的处理方法,业务层什么的分开了
		if(homepagepro.AssertLogin(pro.getPro("yq"))){
			System.out.println("登陆成功"+username);
			handcookie.writeCookie();
		}
	}
	@AfterClass
	public void afterClass(){
		driver.close();
	}
}

配置文件
在这里插入图片描述

读取配置文件的方法,因为要在SuiteTestLogin.java中读取loginTest.properties文件所以构造方法
src/test/java/com/mushishi/selenium/util/ProUtil.java

package com.mushishi.selenium.util;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ProUtil {
	private Properties prop;
	private String filePaht;
	/**
	 * 构造方法
	 * */
	public ProUtil(String filePath){
		this.filePaht = filePath;
		this.prop = readProperties();
	}
	
	/**
	 * 读取配置文件
	 * */
	private Properties readProperties(){
		Properties properties = new Properties();
		try {
			InputStream inputStream = new FileInputStream(filePaht);
			BufferedInputStream in = new BufferedInputStream(inputStream);
			properties.load(in);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		return properties;
	}
	
	/**
	 * 根据key读取关键字内容
	 * */
	public String  getPro(String key){
		if(prop.containsKey(key)){
			String username = prop.getProperty(key);
			return username;
		}else{
			System.out.println("你获取key值不对");
			return "";
		}	
	}
	/**
	 * 写入内容
	 * */
	public void writePro(String key,String value){
		Properties pro = new Properties();
			try {
				FileOutputStream file = new FileOutputStream(filePaht);
				pro.setProperty(key, value);
				pro.store(file, key);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

}

src/test/java/com/mushishi/selenium/page/HomePage.java
中的getUserNameElement函数获取用户名信息

package com.mushishi.selenium.page;

import org.openqa.selenium.WebElement;

import com.mushishi.selenium.base.DriverBase;
import com.mushishi.selenium.util.getByLocator;

public class HomePage extends BasePage{
	public HomePage(DriverBase driver){
		super(driver);
	}
	/**
	 * 获取点击登陆element
	 * */
	public WebElement getLoginElement(){
		return element(getByLocator.getLocator("login"));
	}
	/**
	 * 获取实战element
	 * */
	public WebElement getCodingElement(){
		return nodeElement(getByLocator.getLocator("tophead"),getByLocator.getLocator("coding"));
	}
	
	/**
	 * 获取用户名信息element
	 * */
	public WebElement getUserNameElement(){
	//移动到header上
		action(element(getByLocator.getLocator("header")));
	//获取用户名
		return element(getByLocator.getLocator("nameInfo"));
	}

	
}

对element.properties文件查看
在这里插入图片描述
src/test/java/com/mushishi/selenium/util/getByLocator.java方法读取文件element.properties文件进行处理

package com.mushishi.selenium.util;

import org.openqa.selenium.By;

public class getByLocator {
	public static By getLocator(String key){
		ProUtil pro = new ProUtil("element.properties");
		String locator = pro.getPro(key);
		String locatorType = locator.split(">")[0];
		String locatorValue = locator.split(">")[1];
		if(locatorType.equals("id")){
			return By.id(locatorValue);
		}else if(locatorType.equals("name")){
			return By.name(locatorValue);
		}else if(locatorType.equals("tagName")){
			return By.tagName(locatorValue);
		}else if(locatorType.equals("linkText")){
			return By.linkText(locatorValue);
		}else if(locatorType.equals("className")){
			return By.className(locatorValue);
		}else{
			return By.xpath(locatorValue);
		}
	}
}

action.moveToElement用法
src/test/java/com/mushishi/selenium/base/DriverBase.java封装了action方法
文件中需要的action函数
就是利用悬停的进行用户名获取
在这里插入图片描述

    /**
     * actionMoveElement
     * */
    public void action(WebElement element){
    	Actions action =new Actions(driver);
    	action.moveToElement(element).perform();
    }

文件中需要的定位函数
element函数
src/test/java/com/mushishi/selenium/page/BasePage.java定位元素

	/**
	 * 定位一组elements
	 * */
	public List<WebElement> elements(By by){
		return driver.findElements(by);
	}
	/**
	 * 通过父节点定位一组elements
	 * */
	public List<WebElement> elements(WebElement element,By by){
		return element.findElements(by);
	}

	

src/test/java/com/mushishi/selenium/handle/HomePageHandle.java
getUserName函数获取用户名里面用到了HomePage的getUserNameElement方法

package com.mushishi.selenium.handle;

import com.mushishi.selenium.base.DriverBase;
import com.mushishi.selenium.page.HomePage;

public class HomePageHandle {
	public DriverBase driver;
	public HomePage hp;
	public HomePageHandle(DriverBase driver){
		this.driver = driver;
		hp = new HomePage(driver);
	}
	/**
	 * 点击登陆按钮
	 * */
	public void clickLogin(){
		hp.click(hp.getLoginElement());
	}
	
	/**
	 * 点击实战按钮
	 * */
	public void clickCoding(){
		hp.click(hp.getCodingElement());
	}
	/**
	 * 获取用户名
	 * */
	public String getUserName(){
	//getText获取文字
		String username = hp.getText(hp.getUserNameElement());
		return username;
	}

	
}

src/test/java/com/mushishi/selenium/business/HomePagePro.java业务层上加判断
AssertLogin函数 根据用户名判断登陆信息是否正确,里面用到了HomePageHandle的getUserName()方法

package com.mushishi.selenium.business;

import com.mushishi.selenium.base.DriverBase;
import com.mushishi.selenium.handle.HomePageHandle;

public class HomePagePro {
	public HomePageHandle hph;
	public HomePagePro(DriverBase driver){
		hph =new HomePageHandle(driver);
	}
	/**
	 * 点击登陆按钮
	 * */
	public void clickLoginButton(){
		hph.clickLogin();
	}
	/**
	 * 点击实战按钮
	 * */
	public void clickCodingLink(){
		hph.clickCoding();
	}
	/**
	 * 根据用户名判断登陆信息是否正确
	 * */
	public Boolean AssertLogin(String username){
		if(hph.getUserName().equals(username)){
			return true;
		}
		return false;
	}
}

case在企业中运用购物

利用cookie来登陆这样就不用依赖于登陆测试了
通过网页可以查看到cookies在慕课网中cookie命名为apsid
在这里插入图片描述

src/test/java/selenium/testCase/SuiteTestBuy.java

package selenium.testCase;

import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import selenium.base.DriverBase;
import selenium.business.CoursePagePro;
import selenium.handle.HandleCookie;

/**
 * @Auther: ljm
 * @Date: 2021/10/16/16:34
 * @Description:
 */
public class SuiteTestBuy extends CaseBase{
    public DriverBase driver;
    public CoursePagePro cpp;
    public HandleCookie handleCookie;
    @BeforeClass
    public void beforeClass(){
        this.driver =InitDriver("chrome");
        cpp = new CoursePagePro(driver);
        handleCookie =new HandleCookie(driver);
        driver.get("https://coding.imooc.com/class/522.html?mc_marking=bb86c9071ed9b7cf12612a2a85203372&mc_channel=hk");
        handleCookie.setCookie();
        //写进cookie需要再次刷新才能生效
        driver.get("https://coding.imooc.com/class/522.html?mc_marking=bb86c9071ed9b7cf12612a2a85203372&mc_channel=hk");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testBuy() {
        cpp.buyNow();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


    }

    @AfterClass
    public void afterClass(){
        driver.close();
    }
}

src/test/java/selenium/handle/HandleCookie.java
对cookie进行读和写

package selenium.handle;

import org.openqa.selenium.Cookie;
import selenium.base.DriverBase;
import selenium.util.ProUtil;

import java.util.Set;

/**
 * @Auther: ljm
 * @Date: 2021/10/16/16:47
 * @Description:
 */
public class HandleCookie {
    public DriverBase driver;
    //读取文件的
    public ProUtil pro;

    public HandleCookie(DriverBase driver) {
        this.driver = driver;
        pro = new ProUtil("src/test/resources/cookie.properties");
    }
    public void setCookie() {
        String value = pro.getPro("apsid");
        //作用域是imooc.com
        Cookie cookie = new Cookie("apsid",value,"imooc.com","/",null);
        driver.setCookie(cookie);

    }
    /***
    * @Param:
    * @return:
    * @Author: ljm
    * @Date: 2021/10/16
    * @Description: 获取cookie
    */
    public void writeCookie(){
        Set<Cookie> cookies = driver.getCookie();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("apsid")){
                pro.writePro(cookie.getName(),cookie.getValue());
            }
        }
    }
}

src/test/resources/cookie.properties
直接将
在这里插入图片描述
src/test/java/selenium/base/DriverBase.java
用到driverbase的setcookie和getcookie方法

    //设置cookie
    public void setCookie(Cookie cookie) {
        driver.manage().addCookie(cookie);

    }
    //获取cookcie
    public Set<Cookie> getCookie() {
        Set<Cookie> cookies = driver.manage().getCookies();
        return cookies;
    }

src/test/java/selenium/util/ProUtil.java
对cookie.properties进行读写

package selenium.util;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ProUtil {
	private Properties prop;
	private String filePaht;
	/**
	 * 构造方法
	 * */
	public ProUtil(String filePath){
		this.filePaht = filePath;
		this.prop = readProperties();
	}
	
	/**
	 * 读取配置文件
	 * */
	private Properties readProperties(){
		Properties properties = new Properties();
		try {
			InputStream inputStream = new FileInputStream(filePaht);
			BufferedInputStream in = new BufferedInputStream(inputStream);
			properties.load(in);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		return properties;
	}
	
	/**
	 * 根据key读取关键字内容
	 * */
	public String  getPro(String key){
		if(prop.containsKey(key)){
			String username = prop.getProperty(key);
			return username;
		}else{
			System.out.println("你获取key值不对");
			return "";
		}	
	}
	/**
	 * 写入内容
	 * */
	public void writePro(String key,String value){
		Properties pro = new Properties();
			try {
				FileOutputStream file = new FileOutputStream(filePaht);
				pro.setProperty(key, value);
				pro.store(file, key);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

}

对上文登陆页面进行修改
登陆成功就自动存入cookies实现自动化
在这里插入图片描述在testng.xml中进行修改,这样就对两个文件进行测试,具体流程可以理解为先登陆,登陆成功并且将cookies存入cookies.properties中用于后面购买测试的登陆,再进行购买测试
在这里插入图片描述

二、selenium框架面试实战

TestNG如何管理case?
先建主键,之后才有了我们的case
testng配置文件,class代表配置文件
在这里插入图片描述
在这里插入图片描述多线程实现 testng多线程机制

在这里插入图片描述
企业case的应用,比如说登陆的时候保存cookies,测试时候运行cookies即可。

在这里插入图片描述
testng断言常用的方法,自己查

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值