慕课网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

实现截图:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值