通过Java + selenium +testNG + Page Objects 设计模式 实现页面UI的自动化

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>
原文地址:https://www.cnblogs.com/zddwork/p/11466527.html