《手把手教你》系列基礎篇(九十七)-java+ selenium自動化測試-框架設計篇-Selenium方法的二次封裝和頁面基類(詳解教程)


1.簡介

  上一篇宏哥介紹了如何設計支持不同瀏覽器測試,宏哥的方法就是通過來切換配置文件設置的瀏覽器名稱的值,來確定啟動什么瀏覽器進行腳本測試。宏哥將這個叫做瀏覽器引擎類。這個類負責獲取瀏覽器類型和啟動不同瀏覽器,並做一些前提操作,例如:最大化瀏覽器窗口和,打開測試服務器地址。

   今天這篇宏哥打算介紹如何封裝幾個Selenium公共的方法到頁面基類中去。首先宏哥給小伙伴或者童鞋們解釋一下頁面基類,看到基類,我們想起了繼承。沒錯,在這個框架基於POM的思想上,我們需要利用繼承的特點,來實現,減少我們重復代碼量。

2.為什么要定義一個頁面基類呢?

  我們已經知道或者了解POM,前邊開頭也介紹過,我們每個模塊或者相關功能,都能在一個個頁面類上去定義和寫相關業務操作方法。但是由於很多頁面,我們有些方法是相同的,例如:判斷一個元素是否在頁面顯示,還有元素點擊和輸入操作,還有判斷頁面標題和頁面地址等等,甚至,有些軟件web不同頁面有公共的元素。這些因素,決定了我們需要寫一個頁面父類,來定義一些公共的方法或者公共的元素,宏哥將這個頁面父類稱之為頁面基類。

3.Selenium方法的二次封裝

1.先按照如下圖,創建一個BasePage的類,如下圖所示:

2.將selenium的方法進行二次封裝,這個類就叫頁面基類。這個叫頁面基類,以后POM里面每個頁面新寫的類都需要繼承這個BasePage類。如下圖所示:

3.BasePage的代碼內容參考如下:

package framework;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

/**
 * @author 北京-宏哥
 * 
 * @公眾號:北京宏哥
 * 
 * 《手把手教你》系列基礎篇(九十七)-java+selenium自動化測試-框架設計篇-Selenium方法的二次封裝和頁面基類(詳解教程)
 *
 * 2022年4月29日
 */

public class BasePage {

    public static WebDriver driver;
    public static String pageTitle;
    public static String pageUrl;

    /*
     * 構造方法
     */
    protected BasePage(WebDriver driver) {
        BasePage.driver = driver;
    }

    /*
     * 在文本框內輸入字符
     */
    protected void type(WebElement element, String text) {
        try {
            if (element.isEnabled()) {
                element.clear();
                Logger.Output(LogType.LogTypeName.INFO,
                        "Clean the value if any in " + element.toString() + ".");
                element.sendKeys(text);
                Logger.Output(LogType.LogTypeName.INFO, "Type value is: "
                        + text + ".");
            }
        } catch (Exception e) {
            Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + ".");
        }

    }

    /*
     * 點擊元素,這里指點擊鼠標左鍵
     */
    protected void click(WebElement element) {

        try {
            if (element.isEnabled()) {
                element.click();
                Logger.Output(LogType.LogTypeName.INFO,
                        "Element: " + element.toString() + " was clicked.");
            }
        } catch (Exception e) {
            Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + ".");
        }

    }

    /*
     * 在文本輸入框執行清除操作
     */
    protected void clean(WebElement element) {

        try {
            if (element.isEnabled()) {
                element.clear();
                Logger.Output(LogType.LogTypeName.INFO,
                        "Element " + element.toString() + " was cleaned.");
            }
        } catch (Exception e) {
            Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + ".");
        }

    }

    /*
     * 判斷一個頁面元素是否顯示在當前頁面
     */
    protected void verifyElementIsPresent(WebElement element) {

        try {
            if (element.isDisplayed()) {
                Logger.Output(LogType.LogTypeName.INFO, "This Element "
                        + element.toString().trim() + " is present.");

            }
        } catch (Exception e) {
            Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + ".");
        }
    }

    /*
     * 獲取頁面的標題
     */
    protected String getCurrentPageTitle() {

        pageTitle = driver.getTitle();
        Logger.Output(LogType.LogTypeName.INFO, "Current page title is "
                + pageTitle);
        return pageTitle;
    }

    /*
     * 獲取頁面的url
     */
    protected String getCurrentPageUrl() {

        pageUrl = driver.getCurrentUrl();
        Logger.Output(LogType.LogTypeName.INFO, "Current page title is "
                + pageUrl);
        return pageUrl;
    }

}

從上面代碼看到:宏哥實現了Selenium的元素判斷是否顯示,和元素清除,點擊,輸入等方法的二次封裝。還有我們寫了每個頁面都存在的獲取標題和url的方法。其他的方法,宏哥先不全部放上去進行封裝,以后宏哥會慢慢完善BasePage這個基類。接下來,宏哥就需要在實現POM里去測試這個頁面基類是否能夠正常使用。

4.測試頁面基類

4.1測試場景

宏哥就在這里用一個簡單的測試場景:打開瀏覽器訪問百度首頁,然后在搜索框中輸入“北京-宏哥”,最后點擊“百度一下”按鈕。測試場景簡單這里測試用例就不再贅述了,直接進入主題:測試頁面基類是否可以正常使用。

4.2代碼設計

1.在pageObject包中,創建一個BaiduSearchPage類,如下圖所示:

2.在testSuit包中,創建一個測試類:testBasePage,如下圖所示:

4.3參考代碼

(1)BaiduSearchPage.java

package pageObject;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

import framework.BasePage;

/**
 * @author 北京-宏哥
 * 
 * @公眾號:北京宏哥
 * 
 * 《手把手教你》系列基礎篇(九十七)-java+selenium自動化測試-框架設計篇-Selenium方法的二次封裝和頁面基類(詳解教程)
 *
 * 2022年4月29日
 */

public class BaiduSearchPage extends BasePage{

    /*
     * 百度的首頁,主要提供一些其他子模塊或者頁面的入口,一般點擊一個元素,進入下一頁面
     */
    
    /**
     * @param driver
     */
    public BaiduSearchPage(WebDriver driver) {
        super(driver);
        // TODO Auto-generated constructor stub
    }
    
    // 元素定位
    //搜索輸入框
    @FindBy (id="kw")
    WebElement search_inputBox;
    
    //搜索提交按鈕
    @FindBy (id="su")
    WebElement search_submitBtn;
    
    /*
     * 搜索框輸入關鍵字,點擊搜索
     */
    public void searchWithKeyword(String keyword){
        
        //繼承頁面基類里的輸入和點擊方法
        type(search_inputBox, keyword);
        click(search_submitBtn);

    }
    
}

(2)testBasePage.java

package testSuite;

import java.io.IOException;


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import pageObject.BaiduSearchPage;
import framework.BrowserEngine;

/**
 * @author 北京-宏哥
 * 
 * @公眾號:北京宏哥
 * 
 * 《手把手教你》系列基礎篇(九十七)-java+selenium自動化測試-框架設計篇-Selenium方法的二次封裝和頁面基類(詳解教程)
 *
 * 2022年4月09日
 */

public class testBasePage {
    
public WebDriver driver;
    
    @BeforeClass
    public void setUp() throws IOException{
        
        BrowserEngine browserEngine = new BrowserEngine();
        browserEngine.initConfigData();
        driver=browserEngine.getBrowser();

    }
    
    @Test
    public void search() throws InterruptedException{

        BaiduSearchPage searchpage = PageFactory.initElements(driver, BaiduSearchPage.class);
        Thread.sleep(5000);
        searchpage.searchWithKeyword("北京-宏哥");

    }
    
    @AfterClass
    public void tearDown() throws InterruptedException{
        
        Thread.sleep(5000);
        driver.quit();

    }

}

4.4運行代碼

1.運行代碼,右鍵Run AS->TestNG Suite,控制台輸出,如下圖所示:

2.運行代碼后電腦端的瀏覽器的動作,如下小視頻所示:

5.小結

注意了,敲黑板!!!!在寫代碼的過程中 ,一個小問題耽誤了好久,那就在類中,宏哥將那個super的方法給定義成protected的,這個是由於eclipse自帶提示宏哥就默認了,沒有想到是會影響后邊的調用。結果一直報錯如下:

解決辦法:修改成public就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM