其他分享
首页 > 其他分享> > 20210425页面对象模式

20210425页面对象模式

作者:互联网

页面对象模式

将测试代码与和被测页面的页面元素及其操作方法进行分离;

一、目的:降低页面元素变化对测试代码的影响。

二、方法:每一个测试页面都会被单独定义为一个类,类中会定位所有需要参与测试的页面元素对象,并且定义每一个页面元素对象的的方法。

三、设计模式的优点

​ 1.减少代码的重复。

​ 2.提高测试用例的可读性。

​ 3.提高测试用例的可维护性。

四、三种方法

​ 1.以get***封装页面。

public class LoginPage{
    private WebDriver driver;
    //1.以get***封装页面。
    public WebElement get_username(){
        return this.driver.findElement(By.name("username"));
    }
    
    public void login(String name){
        			                    this.driver.get("http://localhost:8032/mymovie/admin.php/Login/index.html");
        this.get_username().sendKeys("admin");
    }
}

​ 2.以@FindBy封装页面对象。

​ 3.页面类继承LoadableComponent


###使用注解获取页面元素

如果有重名的默认找DOM树中靠前的

//2.以@FindBy封装页面对象。



//类中会定位所有需要参与测试的页面元素对象
@FindBy(id= "A") 
private WebElement A;

//取交集
@FindBys({ 
	@FindBy(className = "A"), 
	@FindBy(id = "B") }
) 
public WebElement AB;

//取并集
@FindAll({ 
	@FindBy(id = "A"), 
	@FindBy(id = "B")
 })

PageFactory类封装页面的元素

通过initElements方法初始化的各个页面对象。

在测试类中创建这个对象(实例化)然后去在初始化所有元素

//每一个测试页面都会被单独定义一个类
//类中会定位所有需要参与测试的页面元素对象
public class LoginPage2 {
	public WebDriver driver;
	public String url="http://localhost:8032/mymovie/admin.php/Login/index.html";
	
	public LoginPage2(WebDriver driver ) {
		this.driver=driver;
        //PageFactory配合页面对象模式,为每个页面创建隐式等待
        //通过initElements方法初始化的各个页面对象。
		PageFactory.initElements(driver, this);
        
        //指定时间找到元素就继续,找不到抛出NoSuchElementException异常
		
	}
	
	@FindBy(name="username")
	public WebElement txt_username;
	
	@FindBy(name = "password")
	public WebElement txt_password;
	
	@FindBy(xpath = "//input[@type='submit']")
	public WebElement btn_submit;
	
	public void login(String user_name,String user_pwd) throws InterruptedException {
		this.driver.get(url);
		this.txt_username.sendKeys(user_name);
		this.txt_password.sendKeys(user_pwd);
		this.btn_submit.click();
		Thread.sleep(3000);
	}
}

PageFactory类封装页面的元素的操作方法

在测试类中创建这个对象(实例化)然后去在初始化所有元素

使用LoadableComponent类

​ 继承LoadableComponent类可以在页面加载的时候判断是否加载了正确的页面,只需要重写load() 和isLoaded()两个方法。此方式有助于让页面对象的页面访问操作更加健壮。

load(): 写要跳转到哪个页面

isLoaded():判断页面是否加载成功

load()方法中的代码一般是用来写跳转到某个页面,如driver.get(url) isLoaded() 方法中的代码一般是用来验证页面是否加载完成并成功

例子:比如添加影片的操作(这个例子讲的是两个页面之间的操作)

/*
1.里面的构造方法要传参webdriver pagefactory这句话要写上
2.然后使用注解获取页面元素,便于将其实例化
3.然后是成员方法add_movie() 里面是操作比如click sendkeys

4.把两个页面之间建立起关联  用的是return里面传webdriver
return new MannageMoviePage(driver);

5.在测试类中 add_movie中实例化 load isload 然后创建manage moviepage的对象注意不要用new
6.然后调用add_movie方法

PS:
1.容易出错的地方:NOsuchelements

2.不要直接定义Select,要在方法中实例化Select


//显示等待  webdriverwait
//wait until 就一句等待直到出现文本框;

//assert
//loginPage.load();
//加载页面

//loadableComponent  load当这个页面加载完成
1.先打开页面
2.判断页面有没有打开
3.开始执行我们的操作
*/
public class LoginPage3 extends LoadableComponent<LoginPage3> {
	/*
	继承LoadableComponent类后,只要覆盖了load方法,即使在没有get方法的情况下,也可以进行get方法的调用
	get方法会默认调用页面对象类中的load;
	
	*/
	public WebDriver driver;
	public String url="http://localhost:8032/mymovie/admin.php/Login/index.html";
	
	public LoginPage3(WebDriver driver ) {
		this.driver=driver;
		PageFactory.initElements(driver, this);
		
	}
	
	@FindBy(name="username")
	public WebElement txt_username;
	
	@FindBy(name = "password")
	public WebElement txt_password;
	
	@FindBy(xpath = "//input[@type='submit']")
	public WebElement btn_submit;
	
	public ManageMoviePage login(String user_name,String user_pwd) throws InterruptedException {

		this.txt_username.sendKeys(user_name);
		this.txt_password.sendKeys(user_pwd);
		this.btn_submit.click();
		Thread.sleep(3000);
        //为了关联起两个界面
		return new ManageMoviePage(driver);
	}
	
	
	
	// load()打开网站
	@Override
	protected void load() {
		
		this.driver.get(url);
        
        //WebDriverWait就是等待到某个条件的满足之下然后再继续往下走。
        //driver: 传入WebDriver实例和最多等10秒
        
		WebDriverWait wait=new WebDriverWait(driver, 10);
        
        //wait until 就一句等待直到出现文本框;
        
		wait.until(ExpectedConditions.presenceOfElementLocated(By.name("username")));
	}
    
	//isLoaded()断言浏览器是否打开了正确的网址
	@Override
	protected void isLoaded() throws Error {
        
        //断言浏览器是否打开了正确的网址
		assertEquals(this.driver.getTitle(), "基于ThinkPHP & J-UI 框架的CRM 系统");		
	}

}



public class LoginTest3  extends BaseTest{
	
	@Test
	public void test_login_success() throws InterruptedException {
		LoginPage3  loginPage=new LoginPage3(driver);
		loginPage.load();
		loginPage.isLoaded();
		loginPage.login("admin", "123456");
		assertTrue(this.driver.findElement(By.linkText("退出")).isDisplayed());	
				
	}

}

public class ManageMoviePage {	
	public ManageMoviePage(WebDriver driver) {
		PageFactory.initElements(driver, this);		
	}	
	@FindBy(xpath = "//h2[contains(.,'影片管理')]")
	public WebElement h2_film_manage;
	
	@FindBy(xpath="//a[@title='添加影片']/span")
	public WebElement span_add_film;
	
	@FindBy(name="filmname")
	public WebElement txt_filmname;
	
	
	public void add_movie() throws InterruptedException {
		this.h2_film_manage.click();
		this.span_add_film.click();
		Thread.sleep(3000);
		this.txt_filmname.sendKeys("五一");
	}
	
}

public class ManageMovieTest  extends BaseTest{	
	@Test
	public void test_add_movie() throws InterruptedException {
		LoginPage3 loginPage=new LoginPage3(driver);
		loginPage.load();
		loginPage.isLoaded();
		ManageMoviePage moviePage=loginPage.login("admin", "123456");
		moviePage.add_movie();		
	}
}

ps:driver.quit()不要忘,要不一直电脑运行

标签:load,FindBy,name,driver,模式,20210425,public,页面
来源: https://blog.csdn.net/gao1213977085/article/details/116143157