login页面设计模式po(page object)

1. driver和基类封装

DriverBase:

package HelloMaven.base;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;


public class DriverBase {
	public WebDriver driver;
	public DriverBase(String browser){
		SelectDriver selectdriver= new SelectDriver();
		this.driver = selectdriver.DriverSelect(browser);
	}
	
	public void stopDriver() {
		System.out.println("stop the driver");
		driver.close();
	}
	
	/**
	 * 定位element,封装
	 * */
	public WebElement findElement(By by) {
		return driver.findElement(by);
	}
	public void get(String url) {
		driver.get(url);
	}
}

SelectDriver 根据浏览器选择driver:

package HelloMaven.base;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class SelectDriver {
	public WebDriver DriverSelect(String browser) {
		if (browser.equalsIgnoreCase("firefox")) {
			System.setProperty("webdriver.firefox.driver", "F:\\Java\\FireFoxdriver\\geckodriver.exe");
			return new FirefoxDriver();
		}else {
			System.setProperty("webdriver.chrome", "F:\\Java\\ChromeDriver\\chromedriver.exe");
			return new ChromeDriver();
		}
	}
}

元素定位的存放和读取:

package HelloMaven.base;

import org.openqa.selenium.By;

import HelloMaven.HelloMaven.ProUtil;

public class ElementProperties {
	public By bystr(String element){
		ProUtil property = new ProUtil("element.properities");
		String location = property.GetProperies(element);
		System.out.println("the file value get from properties file is: " + location);
		String way = location.split(">")[0];
		String value = location.split(">")[1];
		System.out.println("value1 is " + way + ", and value2 is:" + value);
		
		if(way.equals("id")) {
			return By.id(value);
		}else if(way.equals("name")){
			return By.name(value);
		}else if(way.equals("className")) {
			return By.className(value);
		}else if(way.equals("xpath")) {
			return By.xpath(value);
		}else
			{return null;}
		
	}
}

BasePage 基础页面的单元性操作行为:

package HelloMaven.page;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import HelloMaven.base.DriverBase;

public class BasePage {
	public DriverBase driver;
	public BasePage(DriverBase driver) {
		this.driver = driver;
	}
	
	/**
	 * 定位element
	 * */
//	public WebElement findElement(By by) {
//		return driver.findElement(by);
//	}
	
	/**
	 * 封装点击
	 * */
	public void click(WebElement element) {
		if(element != null) {
			element.click();
		}else {
			System.out.println("cannot find the element, failed to click");
		}

	}
	
	/**
	 * 封装输入
	 * */
	public void input(WebElement element, String value) {
		if(element != null) {
			element.sendKeys(value);
		}else {
			System.out.println("cannot find the element, failed to input value");
		}
	}
	/**
	 * 封装元素是否存在
	 * */
	public boolean IsDisplayed(WebElement element) {
		return element.isDisplayed();
	}

}

LoginPage 具体页面上元素的获得:

package HelloMaven.page;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import HelloMaven.base.DriverBase;
import HelloMaven.base.ElementProperties;

/**
 * 获得login页面的元素
 * */
public class LoginPage extends BasePage{   
	public LoginPage(DriverBase driver ) {
		super(driver);
	}
	
	ElementProperties EP = new ElementProperties();
	/**
	 * 获取username输入框
	 * */
	public WebElement getUserName() {
		return driver.findElement(EP.bystr("username"));
	}
	
	public WebElement getPassword() {
		
		return driver.findElement(EP.bystr("password"));
	}
	
	public WebElement LoginButton() {
		return driver.findElement(EP.bystr("loginbutton"));
	}


}

LoginHandle 具体页面上的操作:

package HelloMaven.Handle;

import HelloMaven.base.DriverBase;
import HelloMaven.page.LoginPage;

/**
 * 封装login页面所需的action,执行action就需要在调用的函数里new LoginHandle的对象
 * */
public class LoginHandle { 
	public DriverBase driver;
	public LoginPage loginpage;
	public LoginHandle(DriverBase driver) {
		this.driver = driver;
		this.loginpage = new LoginPage(driver);  //如果放在构造函数外面,就是全局变量的那个driver。
系统在调用LoginHandle的时候,首先会读取全局变量。所以放在外面,driver还没有传过来	
	}
	
	/**
	 * 输入用户名
	 * */
	public void InputUsername(String username) {
		loginpage.input(loginpage.getUserName(), username);
	}
	public void InputPassword(String password) {
		loginpage.input(loginpage.getPassword(), password);
	}
	public void clickLogin() {
		loginpage.click(loginpage.LoginButton());
	}
	public boolean IsLoginPage() {
		return loginpage.IsDisplayed(loginpage.getUserName());
	}
}

LoginPro 具体页面的业务流程:

package HelloMaven.business;

import HelloMaven.Handle.LoginHandle;
import HelloMaven.base.DriverBase;

public class LoginPro {
	public LoginHandle loginHandler;  //用handler来具体操作页面
	public LoginPro(DriverBase driver) {
		loginHandler = new LoginHandle(driver); //划重点
	}
	
	public void Login(String username, String password) {
		if (loginHandler.IsLoginPage()) {
		loginHandler.InputUsername(username);
		loginHandler.InputPassword(password);
		loginHandler.clickLogin();
		loginHandler.loginpage.getUserName();
		}else {
			System.out.println("current page is not Login Page, or not loaded");
		}
	}

}

创建test case

首先创建caseBase,用于testcase中初始化driver的操作,适用于所有testcase

package HelloMaven.testcase;

import HelloMaven.base.DriverBase;

/**
 * 生成driver,所有的测试类都继承caseBase类,拿到driver
 * */
public class caseBase {
	public DriverBase InitialDriver(String browser) { //初始化driver,选择driver
		return new DriverBase(browser);
	}

}

创建具体case,testLogin

package HelloMaven.testcase;

import org.apache.log4j.Logger;
import org.openqa.selenium.By;
import org.testng.annotations.Test;

import HelloMaven.base.DriverBase;
import HelloMaven.business.LoginPro;

public class testLogin extends caseBase{
	public DriverBase driver;
	public LoginPro Lpro;
	static Logger logger = Logger.getLogger(testLogin.class);
	public testLogin() {
		this.driver = InitialDriver("Chrome");
		this.Lpro = new LoginPro(driver);
	}
	@Test
	public void getLoginHome() {
		driver.get("http://www.imooc.com");
		driver.findElement(By.id("js-signin-btn")).click();
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	@Test(dependsOnMethods= {"getLoginHome"})
	public void Login() {
		logger.debug("first time for logging");
		Lpro.Login("13610056184", "MISSjj28*");
		
	}
	@Test(dependsOnMethods= {"Login"})
	public void stop() {
		driver.stopDriver();
	}

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Selenium POPage Object设计模式是一种自动化测试的最佳实践,它将页面对象封装在一个类中,使测试代码更加模块化、可读性更高、易于维护。下面是一个简单的Selenium PO设计模式的例子: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class LoginPage: def __init__(self, driver): self.driver = driver self.username_input = (By.ID, 'username') self.password_input = (By.ID, 'password') self.login_button = (By.ID, 'login-button') self.error_message = (By.ID, 'error-message') def enter_username(self, username): WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(self.username_input)) self.driver.find_element(*self.username_input).send_keys(username) def enter_password(self, password): WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(self.password_input)) self.driver.find_element(*self.password_input).send_keys(password) def click_login_button(self): WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable(self.login_button)) self.driver.find_element(*self.login_button).click() def get_error_message(self): WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(self.error_message)) return self.driver.find_element(*self.error_message).text ``` 在这个例子中,我们定义了一个名为LoginPage的类,它包含了登录页面的所有元素和操作。在类的构造函数中,我们使用了Selenium的By类来定义了页面元素的定位方式,例如ID、CSS选择器等。然后,我们定义了一些方法来操作这些元素,例如输入用户名、输入密码、点击登录按钮等。在每个方法中,我们使用了Selenium的WebDriverWait类来等待元素的出现或可点击,以确保测试的稳定性和可靠性。 使用Selenium PO设计模式,我们可以将测试代码和页面元素分离开来,使测试代码更加清晰、易于维护。同时,我们还可以将页面元素的定位方式封装在类中,以便于修改和维护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值