慕课网web自动化测试实战之账号登录(三)

慕课网web自动化测试实战

账号登录

需求:
  1. 在登陆失败情况下,截图。
实现思路:
  1. 封装driver的基类,类中还封装了屏幕截图功能;
  2. 创建testng的监听类,通过监听事件实现失败后自动截图;
  3. 在自动化登录脚本中使用@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

实现截图:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值