慕课网web自动化测试实战
账号登录
需求:
- 在登陆失败情况下,截图。
实现思路:
- 封装driver的基类,类中还封装了屏幕截图功能;
- 创建testng的监听类,通过监听事件实现失败后自动截图;
- 在自动化登录脚本中使用@Lisenter来启动监听。
自动化登录脚本:
import org.openqa.selenium.*;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.Listeners;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 登录慕课网自动化测试脚本
*/
//启用监听,使用注解@Listener({监听类.class})
@Listeners({TestngListenerScreenShot.class})
public class Login_mooc extends BaseDriver{
public void InitDriver() throws InterruptedException {
driver.get("https://www.imooc.com/");
// driver.manage().window().maximize();
Thread.sleep(3000);
}
public void loginScript(String username,String pass) throws InterruptedException, IOException {
//解决广告弹窗
this.element(this.byString("advert")).click();
//进入登录页面
this.element(this.byString("come_login")).click();
Thread.sleep(3000);
WebElement user=this.element(this.byString("userString"));
WebElement password=this.element(this.byString("passwordString"));
WebElement loginButton=this.element(this.byString("loginButtonString"));
System.out.println("账号输入框状态:"+user.isDisplayed());
System.out.println("密码输入框状态:"+password.isDisplayed());
System.out.println("登录按钮状态:"+loginButton.isDisplayed());
user.sendKeys(username); //输入内容
password.sendKeys(pass);
loginButton.click(); //点击登录
takeScreenShot();
Thread.sleep(7000);
//点击用户头像
WebElement header=this.element(this.byString("headString"));
System.out.println("用户头像状态:"+header.isDisplayed());
//悬停到用户头像上
Actions action= new Actions(driver);
action.moveToElement(header).perform();
Thread.sleep(4000);
//获取用户名ID
String userID=this.element(this.byString("userIDString")).getText();
System.out.println("用户名ID:"+userID);
if (userID.equals("慕仔2201893")){
System.out.println("登陆成功");
}else{
System.out.println("登录失败");
}
}
/**
*By定位API的封装
*/
public By byString(String key) throws IOException {
//使用配置文件中的html元素属性数据(key->value)
PropertyUtil propertyUtil=new PropertyUtil("element.properties");
String locator=propertyUtil.getProperty(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("className")){
return By.className(locatorValue);
}else if (locatorType.equals("linkText")){
return By.linkText(locatorValue);
}else if (locatorType.equals("partialLinkText")){
return By.partialLinkText(locatorValue);
}else if(locatorType.equals("tagName")){
return By.tagName(locatorValue);
}else if (locatorType.equals("cssSelector")){
return By.cssSelector(locatorValue);
}else{
return By.xpath(locatorValue);
}
}
/**
* driver.findElement()的封装
*/
public WebElement element(By by){
WebElement element=driver.findElement(by);
return element;
}
public void destroyDriver() throws InterruptedException {
Thread.sleep(2000);
driver.quit();
}
public static void main(String[] args) throws InterruptedException, IOException {
Login_mooc mooc=new Login_mooc();
mooc.InitDriver();
// mooc.loginScript("2794974296@qq.com","dpl12345");
//账号密码参数化
HashMap<String,String> user_name=new HashMap<String, String>();
user_name.put("2794974296@qq.com","dpl123456");
//user_name.put();
Iterator us=user_name.entrySet().iterator();
while (us.hasNext()){
Map.Entry entry= (Map.Entry) us.next();
String userName=entry.getKey().toString();
String passWord=entry.getValue().toString();
mooc.loginScript(userName,passWord);
}
mooc.destroyDriver();
}
}
driver的基类:
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.io.File;
import java.io.IOException;
/**
* Driver的基类
*/
public class BaseDriver {
WebDriver driver;
public BaseDriver(){
driver = new FirefoxDriver();
}
/**
* 截图功能
*/
public void takeScreenShot() throws IOException {
//获取的是当前的系统时间(以时间作为截图的文件名)
long time=System.currentTimeMillis();
String imageTime=String.valueOf(time);
imageTime=imageTime+".png";
//获取当前工程路径
String currentPath=System.getProperty("user.dir");
//截图存放路径为=工程路径+文件名
String screenPath=currentPath+"/"+imageTime;
//截图函数getScreenshotAs()来截取当前窗口
File screen=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screen,new File(screenPath)); //文件名复制到截图
}
}
监听类:
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
import java.io.IOException;
/**
*功能:通过监听事件实现失败后自动截图
* ITestResult:是TestNG提供的一个接口,结合@AfterMethod使用类似监听器,可以监听@Test方法的执行状态等信息
*/
public class TestngListenerScreenShot extends TestListenerAdapter {
@Override
public void onTestSuccess(ITestResult var1) {
super.onTestSuccess(var1);
}
@Override
public void onTestFailure(ITestResult var1) {
super.onTestFailure(var1);
try {
takeScreenShot(var1);
} catch (IOException e) {
e.printStackTrace();
}
}
private void takeScreenShot(ITestResult varl) throws IOException {
//使用此类的getInstance()函数,即可得到系统当前已经实例化的该类对象,
//若当前系统还没有实例化过这个类的对象,则调用此类的构造函数
BaseDriver baseDriver= (BaseDriver) varl.getInstance();
baseDriver.takeScreenShot();
}
@Override
public void onTestSkipped(ITestResult var1) {
super.onTestSkipped(var1);
}
@Override
public void onStart(ITestContext var1) {
super.onStart(var1);
}
@Override
public void onTestStart(ITestResult iTestResult) {
super.onTestStart(iTestResult);
}
@Override
public void onFinish(ITestContext var1) {
super.onFinish(var1);
}
}
配置文件:
element.properties
#key->value
advert=cssSelector>.redrain-closeBtn
come_login=xpath>.//*[@id='js-signin-btn']
userString=name>email
passwordString=name>password
loginButtonString=cssSelector>.moco-btn.moco-btn-red.moco-btn-lg.btn-full.xa-login
#autoSignin=id>auto-signin
headString=xpath>.//*[@id='header-avator']/img
userIDString=xpath>.//*[@id='header-user-card']/div/div/div[1]/div/a/span