----------------------接下来开始采用po思想设计case-----------------------
设计原则:
1 每个类名包含page
2 每个页面分别作为一个page
3 每个页面的的元素作为各自page的成员变量
4 每个page中的元素的操作行为定义成一个方法------为了方便后面查看日志
总结:每个page保存的就是元素的定位信息和元素的行为
---------------------------接下来优化LoginCasesbak------------------------------------
(1)将登录页面和首页分别设计成1个page
1)LoginPage
package com.lemon.pageobject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
/**
* 把页面上的定位元素看成页面的成员变量
* 每个元素封装成一个方法
* @author TF
*
*/
public class LoginPage {
public WebDriver driver;
//有参构造传入driver
public LoginPage(WebDriver driver) {
this.driver=driver;
}
//成员变量1:手机号码输入框定位器
private By mobilephone=By.name("phone");
//成员变量2:密码输入框定位器
private By password=By.name("password");
//成员变量3:登录按钮定位器
private By login=By.xpath("//button[text()='登录']");
//成员变量4:提示信息--{此账号没有授权,请联系管理员!;帐号或密码错误!}--这是后端写的提醒,返回给前端
private By msg=By.className("layui-layer-content");
//成员变量5:input框错误提示信息{"请输入手机号";"请输入密码";"请输入正确的手机号"}
private By tips=By.className("form-error-info");
public void inputMobilephone(String data) {
driver.findElement(mobilephone).sendKeys(data);
}
public void inputPassword(String pwd) {
driver.findElement(password).sendKeys(pwd);
}
public void clickLoginButton() {
driver.findElement(login).click();
}
/**
* 获取提醒信息文本值
* @return
*/
public String getMsgText() {
WebDriverWait wait=new WebDriverWait(driver,5);
return wait.until(ExpectedConditions.visibilityOfElementLocated(msg)).getText();
}
/**
* 获取input框校验提醒信息
* @return
*/
public String getTipsText() {
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement until = wait.until(ExpectedConditions.visibilityOfElementLocated(tips));
return until.getText();
}
/**
* 获取手机号的属性值
*
* @return
*/
public String getPhoneAttribute() {
WebDriverWait wait = new WebDriverWait(driver, 5);
return wait.until(ExpectedConditions.visibilityOfElementLocated(mobilephone)).getAttribute("value");
}
}
2)IndexPage
package com.lemon.pageobject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class IndexPage {
public WebDriver driver;
// 首页--我的账户元素定位器
private By myAccount = By.xpath("//a[contains(text(),'我的帐户')]");
// 首页 --退出元素定位器
private By quit = By.partialLinkText("退出");
// 首页--登录元素定位器
private By login = By.partialLinkText("登录");
public IndexPage(WebDriver driver) {
this.driver = driver;
}
/**
* 待我的账户元素可见
* @return
*/
public boolean WaitmyAccountVisible() {
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement until = wait.until(ExpectedConditions.visibilityOfElementLocated(myAccount));
// until.isDisplayed();判断myAccount元素是否显示出来,返回的是boolean类型的值
return until.isDisplayed();
}
/**
* 点击退出
*/
public void clickQuit() {
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.elementToBeClickable(quit)).click();
}
/**
* 点击登录
*
*/
public void clickLogin() {
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.elementToBeClickable(login)).click();
}
}
(2) 设计登录模块的case---LoginCases
package com.lemon.testcases;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.lemon.pageobject.IndexPage;
import com.lemon.pageobject.LoginPage;
public class Logincases {
public static WebDriver driver;
@BeforeMethod
public void setUp() {
// 前置
// 打开浏览器
openBrowser("chrome");
driver.get("http://120.78.128.25:8765/Index/login.html");
}
/**
* 反向case数据提供源01
*
* @return
*/
@DataProvider
public Object[][] loginDatas01() {
Object[][] datas = { { "13333333331", "lemon123456", "此账号没有经过授权,请联系管理员!" },
{ "13323234545", "lemon12345", "帐号或密码错误!" }, { "13323234545", "lemon1234567", "帐号或密码错误!" },
{ "13323234545", "LEMON123456", "帐号或密码错误!" }, { "13323234545", "lemon 123456", "帐号或密码错误!" }
};
return datas;
}
/**
* 反向case数据提供源02
*
* @return
*/
@DataProvider
public Object[][] loginDatas02() {
Object[][] datas = { { "", "lemon123456", "请输入手机号" }, { "13323234545", "", "请输入密码" },
{ "1332323454", "lemon123456", "请输入正确的手机号" }, { "133232345456", "lemon123456", "请输入正确的手机号" },
{ "133232$454%", "lemon123456", "请输入正确的手机号" }
};
return datas;
}
/**
* 正向用例 成功登录
*/
@Test(priority = 1, enabled = false)
public void Login_success() throws InterruptedException {
// 1实例化LoginPage
LoginPage loginPage=new LoginPage(driver);//调用有参够造
// 2输入手机号
loginPage.inputMobilephone("13323234545");
// 3输入密码
loginPage.inputPassword("lemon123456");
// 4点击登录
loginPage.clickLoginButton();
//5 实例化IndexPage
IndexPage indexPage=new IndexPage(driver);
//6断言--indexPage.WaitmyAccountVisible()返回的是True->即我的账户 元素可见说明断言成功
Assert.assertTrue(indexPage.WaitmyAccountVisible());
}
/**
* 反向用例1 未注册 密码错误(区分大小写,密码长度与正确的密码长度少一位和多一位)
*/
@Test(priority = 2, dataProvider = "loginDatas01")
public void login_failure01(String mobilephone, String pwd, String msg) {
// 1实例化LoginPage
LoginPage loginPage=new LoginPage(driver);//调用有参够造
// 2输入手机号
loginPage.inputMobilephone(mobilephone);
// 3输入密码
loginPage.inputPassword(pwd);
// 4点击登录
loginPage.clickLoginButton();
// 5 断言 loginPage.getMsgText() 对象点方法 获取提示信息文本值
String actualValue = loginPage.getMsgText();
String expectedValue =msg;// 获取元素的文本的值
Assert.assertEquals(actualValue, expectedValue);
}
/**
* 反向用例02 密码为空 账号为空 账号错误(10位,12位,数字和特殊字符组合)
*
* @param mobilephone
* @param pwd
* @param msg
*/
@Test(priority = 3, dataProvider = "loginDatas02")
public void login_failure02(String mobilephone, String pwd, String msg) {
// 1实例化LoginPage
LoginPage loginPage=new LoginPage(driver);//调用有参够造
// 2输入手机号
loginPage.inputMobilephone(mobilephone);
// 3输入密码
loginPage.inputPassword(pwd);
// 4点击登录
loginPage.clickLoginButton();
//5 断言
String actualValue = loginPage.getTipsText();
String expectedValue = msg;// 获取元素的文本的值
Assert.assertEquals(actualValue, expectedValue);
}
/**
* 记住手机号
* 记住手机号,这里默认是勾选的,所有脚本里面不用再找到
* 记住手机号的元素进行.click()
* @param mobilephone
* @param pwd
* @param msg
*/
@Test
public void login_remeber() {
// 1实例化LoginPage
LoginPage loginPage=new LoginPage(driver);//调用有参够造
// 2输入手机号
loginPage.inputMobilephone("13323234545");
// 3输入密码
loginPage.inputPassword("lemon123456");
// 4点击登录
loginPage.clickLoginButton();
// 5 实例化indexPage
IndexPage indexPage=new IndexPage(driver);
//6 点击 退出
indexPage.clickQuit();
// 7 点击登录
indexPage.clickLogin();
// 8 断言:获取手机号---注意这里的手机号是<input value="手机号">
String actualValue =loginPage.getPhoneAttribute();
String expectedValue = "13323234545";// 获取元素的文本的值
Assert.assertEquals(actualValue, expectedValue);
}
@AfterMethod
public void teardown() {
// 退出浏览器
driver.quit();
}
public static void openBrowser(String browser) {
if (browser.equals("chrome")) {
// 1.设置chromedriver驱动文件的路径
System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
// 2.打开浏览器
driver = new ChromeDriver();
// 4.退出浏览器即关闭浏览器
// quit是退出浏览器,close是只关闭当前打开的窗口,不等于关闭整个浏览器
// driver.quit();
}
}
}
注意:
Web自动化即UI自动化-->UI自动化最怕的就是稳定性,如果稳定性差,就没做的必要,所以要保证框架的稳定性,UI自动化有个通过性的指标,每次跑脚本的时候,case因为框架的bug导致脚本执行失败,那这个自动化脚本设计就是不通过的,没有做的必要了
网友评论