• 通过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>
  • 相关阅读:
    解题报告 百进制数
    解题报告 Loongint 的夜晚
    解题报告 树形图计数
    解题报告 一元三次方程求解
    解题报告 Loongint 的旅行安排
    解题报告 数字查找
    用C++编写简单绘图语言的词法分析器——程序清单
    C++ 连接 mysql 的一个例子(Visual Studio 2005)
    fedora 8 下JDK 6.0 配置
    IBM DB2 V9 常用命令
  • 原文地址:https://www.cnblogs.com/zddwork/p/11466527.html
Copyright © 2020-2023  润新知