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