项目测试实战|慕课网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=https://www.it610.com/article/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> user_name=new HashMap, 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->valueadvert=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

实现截图: 【项目测试实战|慕课网web自动化测试实战之账号登录(三)】项目测试实战|慕课网web自动化测试实战之账号登录(三)
文章图片

    推荐阅读