通过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>

 

posted @ 2020-11-11 20:02  北极星0202  阅读(205)  评论(0编辑  收藏  举报