zoukankan      html  css  js  c++  java
  • 通过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

    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>
  • 相关阅读:
    Java 8 Lambda 表达式
    OSGi 系列(十二)之 Http Service
    OSGi 系列(十三)之 Configuration Admin Service
    OSGi 系列(十四)之 Event Admin Service
    OSGi 系列(十六)之 JDBC Service
    OSGi 系列(十)之 Blueprint
    OSGi 系列(七)之服务的监听、跟踪、声明等
    OSGi 系列(六)之服务的使用
    OSGi 系列(三)之 bundle 事件监听
    OSGi 系列(三)之 bundle 详解
  • 原文地址:https://www.cnblogs.com/wsy0202/p/13960641.html
Copyright © 2011-2022 走看看