Datos de prueba
dirección de prueba
http://120.78.128.25:8765/
inversores
13323234545
limón123456
Prestatario
13323234444
limon mejor
dirección de fondo
http://120.78.128.25:8765/Admin/Index/login.html
limon7
limon mejor
Objeto de página
Introducción a PO
https://www.selenium.dev/documentation/en/guidelines_and_recommendations/page_object_models/
El objeto de página es uno de los mejores patrones de diseño para las prácticas de desarrollo de proyectos de prueba automatizados de Selenium. El objeto de página se refleja principalmente en la encapsulación de los detalles de interacción de la interfaz , lo que puede hacer que los casos de prueba se preocupen más por el negocio que por los detalles de la interfaz, y mejorar la legibilidad de la prueba. casos sexo.
Las ventajas del patrón de diseño del objeto de página son las siguientes:
- Reducir la duplicación de código;
- Mejorar la legibilidad de los casos de prueba;
- Mejore la capacidad de mantenimiento de los casos de prueba, especialmente para proyectos con cambios frecuentes de IU;
Notas sobre el uso de Paget Object:
- El método público representa la funcionalidad proporcionada por la página.
- Intenta no exponer los detalles internos de la página.
- no afirmar
- Los métodos pueden devolver otros objetos de página
- Page Objects no necesita representar la página completa, puede ser cualquier parte
- La misma operación, se deben separar resultados diferentes (inicio de sesión correcto, inicio de sesión incorrecto)
Usar po es el proceso de abstracción o modelado de la página, que necesita tratar la página como un objeto.
En los lenguajes de programación orientados a objetos, se deben considerar los siguientes dos puntos para la programación orientada a objetos:
- El atributo del objeto "variable global" == el elemento de la página web "método de ubicación, valor de ubicación"
- El comportamiento del objeto "método" == el funcionamiento del elemento de la página web
Escribir la clase base de operación de página
package com.zhongxin.pages;
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 BasePage {
private WebDriver driver;
public BasePage(WebDriver driver) {
this.driver = driver;
}
/**
* 封装显式等待
*
* @param by 元素定位信息
* @return 元素对象
*/
public WebElement waitElementBisibility(By by) {
WebElement element = null;
try {
//5秒元素可见显式等待
WebDriverWait wait = new WebDriverWait(driver, 5);
element = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
return element;
} catch (Exception e) {
System.out.println("元素定位异常" + e.getMessage());
}
return null;
}
}
Empaquetado de la página de destino
package com.zhongxin.pages;
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 LoginPage extends BasePage {
private WebDriver driver;
// phone元素定位信息
private By phoneBy = By.name("phone");
//password元素定位信息
private By passwordBy = By.name("password");
//登陆按钮元素定位信息
private By loginBtnBy = By.xpath("//button[@class='btn btn-special']");
//页面中央错误提示
private By centerErrorBy = By.className("layui-layer-content");
//页面手机红色错误提示
private By phoneformErrorBy = By.xpath("//input[@name='phone']//following-sibling::div");
//页面密码红色错误提示
private By passwordformErrorBy = By.xpath("//input[@name='password']//following-sibling::div");
public LoginPage(WebDriver driver) {
super(driver);
}
//对手机框进行输入
public void inputPhone(String phone) {
WebElement element = waitElementBisibility(phoneBy);
if (element != null) {
element.clear();
element.sendKeys(phone);
}
}
//对密码框进行输入
public void inputPassword(String password) {
WebElement element = waitElementBisibility(passwordBy);
if (element != null) {
element.clear();
element.sendKeys(password);
}
}
//点击登陆按钮
public void clickLoginBtn() {
WebElement element = waitElementBisibility(loginBtnBy);
if (element != null) {
element.click();
}
}
//获取页面中央错误提示文本
public String getCenterErrorText() {
WebElement element = waitElementBisibility(centerErrorBy);
if (element != null) {
return element.getText();
}
return "";
}
//获取页面手机红色错误提示
public String getPhoneFormErrorText() {
WebElement element = waitElementBisibility(phoneformErrorBy);
if (element != null) {
return element.getText();
}
return "";
}
//获取页面手机红色错误提示
public String getPasswordFormErrorText() {
WebElement element = waitElementBisibility(passwordformErrorBy);
if (element != null) {
return element.getText();
}
return "";
}
}
Paquete de casa
package com.zhongxin.pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;
public class IndexPage extends BasePage {
private WebDriver driver;
//昵称
private By nicknameBy = By.xpath("//a[contains(text(),'我的帐户[自动化测试帐号1]')]");
public IndexPage(WebDriver driver) {
super(driver);
}
// 昵称是否可见
public boolean nicknameIsVisibility() {
WebElement element = waitElementBisibility(nicknameBy);
if (element != null) {
return element.isDisplayed();
}
return false;
}
}
código de prueba
package com.zhongxin.cases;
import com.zhongxin.pages.IndexPage;
import com.zhongxin.pages.LoginPage;
import okio.Timeout;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class LoginCase {
public WebDriver driver;
@BeforeClass
public void setUp() {
//打开浏览器
driver = open("chrome");
//访问登陆页面
driver.get("http://120.78.128.25:8765/Index/login.html");
}
@Test
public void testFailed01() throws InterruptedException {
LoginPage loginpage = new LoginPage(driver);
loginpage.inputPhone("13212312312");
loginpage.inputPassword("123123123");
loginpage.clickLoginBtn();
String actual = loginpage.getCenterErrorText();
String expected = "此账号没有经过授权,请联系管理员!";
Assert.assertEquals(actual, expected);
}
@Test
public void testFailed02() throws InterruptedException {
LoginPage loginpage = new LoginPage(driver);
loginpage.inputPhone("");
loginpage.inputPassword("123123123");
loginpage.clickLoginBtn();
String actual = loginpage.getPhoneFormErrorText();
String expected = "请输入手机号";
Assert.assertEquals(actual, expected);
}
@Test(dataProvider = "datas")
public void testFailed03(String phone, String password, String expected) throws InterruptedException {
LoginPage loginpage = new LoginPage(driver);
loginpage.inputPhone(phone);
loginpage.inputPassword(password);
loginpage.clickLoginBtn();
String actual = loginpage.getPhoneFormErrorText();
Assert.assertEquals(actual, expected);
}
@Test
public void testFailed04() throws InterruptedException {
LoginPage loginpage = new LoginPage(driver);
loginpage.inputPhone("15859019251");
loginpage.inputPassword("");
loginpage.clickLoginBtn();
String actual = loginpage.getPasswordFormErrorText();
Assert.assertEquals(actual, "请输入密码");
}
@Test
public void testFailed05() throws InterruptedException {
LoginPage loginpage = new LoginPage(driver);
loginpage.inputPhone("13323234545");
loginpage.inputPassword("123123123");
loginpage.clickLoginBtn();
String actual = loginpage.getCenterErrorText();
Assert.assertEquals(actual, "帐号或密码错误!");
}
@Test
public void testSuccess() throws InterruptedException {
LoginPage loginpage = new LoginPage(driver);
loginpage.inputPhone("13323234545");
loginpage.inputPassword("lemon123456");
loginpage.clickLoginBtn();
Thread.sleep(2000);
IndexPage indexPage = new IndexPage(driver);
boolean flag = indexPage.nicknameIsVisibility();
Assert.assertTrue(flag);
}
@DataProvider
public Object[][] datas() {
Object[][] datas = {
{"", "123123123", "请输入手机号"},
{"1585901925", "123123123", "请输入正确的手机号"},
{"158590192534", "123123123", "请输入正确的手机号"},
{"1585901925%", "123123123", "请输入正确的手机号"},
};
return datas;
}
@AfterClass
public void tearDown() throws InterruptedException {
Thread.sleep(2000);
//关闭浏览器
close(driver);
}
public static void close(WebDriver driver) throws InterruptedException {
Thread.sleep(3000);
driver.quit();
}
public static WebDriver open(String type) {
WebDriver driver = null;
if ("chrome".equalsIgnoreCase(type)) {
System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver");
driver = new ChromeDriver();
} else if ("ie".equalsIgnoreCase(type)) {
// 设置ie启动项
DesiredCapabilities capabilities = new DesiredCapabilities();
// 忽略缩放
capabilities.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true);
// 忽略保护模式
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
// 设置初始化浏览器地址
capabilities.setCapability(InternetExplorerDriver.INITIAL_BROWSER_URL, "https://www.baidu.com");
// 配置ie驱动位置
System.setProperty("webdriver.ie.driver", "src/test/resources/IEDriverServer.exe");
// 创建ie驱动对象
driver = new InternetExplorerDriver();
} else if ("firefox".equalsIgnoreCase(type)) {
System.setProperty("webdriver.firefox.bin", "D:\\Mozilla Firefox\\firefox.exe");
System.setProperty("webdriver.firefox.driver", "src/test/resources/geckodriver.exe");
driver = new FirefoxDriver();
}
return driver;
}
}
Finalmente, un modesto esfuerzo
Gracias a todos los que leyeron mi artículo con atención, aunque no es algo muy valioso, si pueden usarlo, se lo pueden llevar:
Estos materiales deberían ser el almacén de preparación más amplio y completo para los amigos [de pruebas de software]. Este almacén también ha acompañado a decenas de miles de ingenieros de pruebas a través del viaje más difícil. ¡Espero que también pueda ayudarlo a usted!