Page Objects 设计模式
简单的讲,类似与Java面向对象编程,把每个页面都抽象为一个对象类,将页面元素的定位、业务逻辑操作分离开,然后我们可以通过testNG实现业务流程的控制 与 测试
Page Objects实现的方法
1、@FindBy()注解
@FindBy(id=" "),id也可以换位xpath、name、textlink等
通过此注解实现元素定位
2、功能实现
通过自定义的方法,来实现具体的业务逻辑
pageFactory
page object 类主要实现页面对象的初始化,负责把页面对象加单化。
PageFactory类提供的方法都是静态的,可以直接调用,
PageFactory.initElements(WebDriver driver, java.lang.Class<T> pageClassToProxy)
我的实际设计思想是:
三层:
1、编写BasePage.java
该类主要作用是把所有测试的页面公共的方法抽出来单独包装
2、编写具体的某个页面对象类,例如:Login.java
该类主要是对某个测试页面元素的定位、和业务逻辑实现;该类需要继承BasePage类
3、使用testNG编写具体测是类,例如:TestLogin.java
最后通过testNG 的xml文件实现测试用例(即方法)的执行
下面是通过登录操作实现page Objects的设计思想:
BasePage.java
public class BasePage { WebDriver driver; String pageTitle; Actions action; public BasePage(WebDriver driver) { this.driver = driver; action = new Actions(this.driver); this.driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } //打开一个指定的url public void my_open(String url) { // 浏览器最大化 this.driver.manage().window().maximize(); this.driver.get(url); Reporter.log("打开网址:" + url); } // 点击操作 public void my_click(WebElement element) { try { element.click(); Reporter.log("点击:" + my_getResult(element)); } catch (Exception e) { System.out.println(e); } } //文本款输入指定的值 public void my_input_text(WebElement element, String text) { try { element.sendKeys(text); Reporter.log("文本框输入的值为:" + text); } catch (Exception e) { e.printStackTrace(); } } }
LoginSpEnterprise .java
public class LoginSpEnterprise extends BasePage { public LoginSpEnterprise(WebDriver driver) { super(driver); } // 定位页面元素 @FindBy(id = "assistid") WebElement useName; @FindBy(id = "userid") WebElement useId; @FindBy(id = "passWord") WebElement passWord; @FindBy(xpath="//input[@value='登录']") WebElement login_button; //业务操作 public void login(String username,String userid,String password) { //输入用户名 my_input_text(useName, username); //输入用户id my_input_text(useId, userid); //输入密码 my_input_text(passWord, password); //点击登录 my_click_button(login_button); } }
testNG测试类:TestLoginSpEnterprise.java
有2点需要注意:
1.driver对象需要指定为静态变量,这样就能保证,在整个测试过程中,driver的传递是唯一的
2.LoginSpEnterprise ls = PageFactory.initElements(driver, LoginSpEnterprise.class);
此处就是实现 LoginSpEnterprise登录页面对象的初始化,如果有多个页面对象需要执行,则下一个测试类里面页面对象的初始化则变为:Open
public class TestLoginSpEnterprise { public static WebDriver driver; @DataProvider public Object[][] lg(){ return new Object[][] { // {"","admin","a111111"}, // {"fan1","","a111111"}, {"fan1","admin","a111111"}, }; } @Test(dataProvider="lg",description="测试登录自服务平台") public void testLogin(String username,String userid,String password) { LoginSpEnterprise ls = PageFactory.initElements(driver, LoginSpEnterprise.class); ls.my_open("http://10.10.178.152:8080/spEnterprise/authenticationPos!login.action"); ls.login(username, userid, password); } @BeforeClass public void beforeClass() { System.setProperty("webdriver.chrome.driver", "E:\workspace\seleniumSource\lib\chromedriver.exe"); driver = new ChromeDriver(); } }
通过testNG.xml实现测试方法的执行
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="线下代理商自服务UI自动化"> <listeners> <listener class-name="dong.test.Untils.TestngListener" /> </listeners> <test name="登录页面测试"> <classes> <class name="dong.test.PO.TestLoginSpEnterprise"> <methods> <include name="testLogin"></include> </methods> </class> </classes> </test> </suite>