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
1 public class BasePage { 2 WebDriver driver; 3 String pageTitle; 4 Actions action; 5 6 public BasePage(WebDriver driver) { 7 this.driver = driver; 8 action = new Actions(this.driver); 9 this.driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 10 11 } 12 13 //打开一个指定的url 14 public void my_open(String url) { 15 // 浏览器最大化 16 this.driver.manage().window().maximize(); 17 this.driver.get(url); 18 Reporter.log("打开网址:" + url); 19 } 20 21 // 点击操作 22 public void my_click(WebElement element) { 23 try { 24 25 element.click(); 26 Reporter.log("点击:" + my_getResult(element)); 27 } catch (Exception e) { 28 System.out.println(e); 29 } 30 } 31 32 //文本款输入指定的值 33 public void my_input_text(WebElement element, String text) { 34 try { 35 element.sendKeys(text); 36 Reporter.log("文本框输入的值为:" + text); 37 } catch (Exception e) { 38 e.printStackTrace(); 39 } 40 } 41 }
LoginSpEnterprise .java
1 public class LoginSpEnterprise extends BasePage { 2 3 public LoginSpEnterprise(WebDriver driver) { 4 super(driver); 5 } 6 7 // 定位页面元素 8 9 @FindBy(id = "assistid") 10 WebElement useName; 11 12 @FindBy(id = "userid") 13 WebElement useId; 14 15 @FindBy(id = "passWord") 16 WebElement passWord; 17 18 @FindBy(xpath="//input[@value='登录']") 19 WebElement login_button; 20 21 //业务操作 22 public void login(String username,String userid,String password) { 23 //输入用户名 24 my_input_text(useName, username); 25 //输入用户id 26 my_input_text(useId, userid); 27 //输入密码 28 my_input_text(passWord, password); 29 //点击登录 30 my_click_button(login_button); 31 } 32 }
testNG测试类:TestLoginSpEnterprise.java
有2点需要注意:
1.driver对象需要指定为静态变量,这样就能保证,在整个测试过程中,driver的传递是唯一的
2.LoginSpEnterprise ls = PageFactory.initElements(driver, LoginSpEnterprise.class);
此处就是实现 LoginSpEnterprise登录页面对象的初始化,如果有多个页面对象需要执行,则下一个测试类里面页面对象的初始化则变为:OpenMerchat om =PageFactory.initElements(TestLoginSpEnterprise.driver,OpenMerchat.class);
1 public class TestLoginSpEnterprise { 2 3 public static WebDriver driver; 4 5 @DataProvider 6 public Object[][] lg(){ 7 return new Object[][] { 8 // {"","admin","1111111"}, 9 // {"fan1","","11111111"}, 10 {"fan1","bbbb","a111111"}, 11 12 }; 13 } 14 15 @Test(dataProvider="lg",description="测试登录自服务平台") 16 public void testLogin(String username,String userid,String password) { 17 LoginSpEnterprise ls = PageFactory.initElements(driver, LoginSpEnterprise.class); 18 ls.my_open("http://xx.xx.xx.xx:8080/spEnterprise/authenticationPos!login.action"); 19 ls.login(username, userid, password); 20 } 21 @BeforeClass 22 public void beforeClass() { 23 System.setProperty("webdriver.chrome.driver", "E:\workspace\seleniumSource\lib\chromedriver.exe"); 24 driver = new ChromeDriver(); 25 } 26 27 }
通过testNG.xml实现测试方法的执行
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 3 <suite name="线下代理商自服务UI自动化"> 4 <listeners> 5 <listener class-name="dong.test.Untils.TestngListener" /> 6 </listeners> 7 <test name="登录页面测试"> 8 <classes> 9 10 <class name="dong.test.PO.TestLoginSpEnterprise"> 11 12 <methods> 13 <include name="testLogin"></include> 14 </methods> 15 16 17 </class> 18 </classes> 19 </test> 20 </suite>