Java + Selenium3.0 + Maven+Excel + Log4j2 的關鍵字驅動框架(Design-StepbyStep)

關鍵子驅動的框架:關鍵字驅動框架- 它更多是作爲一個開發或者測試開發人員,開發的一個框架或者工具,目的是讓不懂代碼的黑盒測試人員去快速編寫測試腳本。

一:關鍵字驅動框架介紹
二:搭建關鍵字驅動框架的步驟
三:識別並設計實現動作關鍵字
四:搭建數據引擎-用Apache POI去讀取數據
五:  用Java反射機制優化
七:對象倉庫
八:測試套件執行引擎

一: 什麼是關鍵字驅動框架?

關鍵字驅動框架(Keyword Driven Framework)是功能自動化測試框架的一種,有時候也叫表格驅動測試(Table-Driver)或者基於動作詞語框架(Action Word based)。

基本的實現原理是:在關鍵字驅動框架中,把測試用例分爲4部分:

測試步驟,測試對象,動作,測試數據。上面的4部分,我們可以藉助excel來進行組織和管理。

測試步驟:是一個很小的測試步驟的描述,例如點擊按鈕。

測試對象:一般是web系統上頁面上的元素,例如用戶名輸入框,登錄按鈕。

動作:例如,點擊,輸入,打開瀏覽器

測試數據:用來給測試對象賦值的數據,例如手機號碼和郵箱字段。

關鍵字驅動的背後思想,就是把一個代碼編寫的自動化測試用例場景拆分成多個很小的測試步驟,特別是給那些不懂代碼或者不熟悉寫自動化測試的手工測試人員提供了一種方式,去實現自動化測試。手工測試人員,不需要關注內部代碼如何實現,他們只需要在數據表,例如execel中按照規則去填寫測試數據,就可以實現測試場景的自動化。

我們來舉例來介紹這種思想,下面舉例登錄服務器的場景。下面的測試步驟,不管是自動化還是手工,基本上都是這麼去劃分。

1. 打開瀏覽器

2. 輸入測試服務器地址

3. 點擊登錄鏈接

4. 輸入用戶名

5. 輸入密碼

6. 點擊登錄按鈕

7. 點擊登出鏈接

8. 關閉瀏覽器,退出測試

上面的步驟,用關鍵字驅動的思想來實現,就是這麼去做的:

下面是我們將要去實現的一些通用組件:

  1. Excel Sheet: 是我們存放測試用例(Test Case)、測試步驟(Test Step)、測試對象(Test Object)和操作動作(Action),測試對象在執行操作時所需要的數據值的關鍵字驅動數據表。

  2. 對象倉庫 Object Repository: 是個屬性文件,用來存放HTML應用中的一些元素屬性,用一個xml文件或者excel文件,或者一個text格式的文件,本項目採用OR.txt文件,裏面把一個軟件項目的頁面所有需要用到的元素對象的表達式都寫到同一個文件,這個文件就叫對象倉庫。

  3. 關鍵字方法庫 Keyword Function Library: 這是一個方法庫文件,定義或者叫封裝一些操作方法,供其他地方調用,這些方法儘量都使用一些簡單的詞彙去描述操作動作,例如點擊,輸入。它主要存放執行的Action,每一個操作動作都可以從這個文件中調用。

  4.   執行引擎 ExecutionEngine: 是唯一的測試腳本,它通過關鍵字框架從Excel表格、方法庫、屬性文件中進行推動測試。

整個過程可以用下面這張圖來表示,或者說關鍵字驅動框架的原理就如下圖。

 

關鍵字驅動框架的優點:

1. 技術門檻低:一旦開發人員設計好了框架,手工測試人員或者沒有相關腳本,代碼經驗的人員都可以按照模板寫自動化測試腳本。

2. 容易理解:基本上都是在維護excel表,沒有在寫代碼,所以測試腳本容易讀和理解。而且看到那些關鍵字方法,就很容易想起手動測試場景。

3. 容易上手:和前面兩個優點差不多意思,主要是不需要代碼知識也能寫測試腳本

4. 組件重用:支持模塊化複用,具有一定的擴展性。

5. 代碼複用:其實調用關鍵字方法就是在複用代碼。包括執行引擎一個用例一個用例執行下去也是在複用代碼。

優勢

  1. 不需要太多的技術:一旦框架建立,手工測試人員和非技術人員都可以很容易的編寫自動化測試腳本。

  2. 簡單易懂:它存在Excel表格中,沒有編碼,測試腳本容易閱讀和理解。關鍵字和操作行爲這樣的手工測試用例,使它變得更容易編寫和維護。

  3. 早期介入:可以在應用未提交測試之前,就可以建立關鍵字驅動測試用例對象庫,從而減少後期工作。使用需求和其它相關文檔進行收集信息,關鍵字數據表可以建立手工測試程序。

  4. 組件的重用性:實施關鍵字驅動的模塊化,進一步提高可重用性。

  5. 代碼的重用性:作爲關鍵字驅動框架中,只有一個執行引擎,它是鼓勵極端的代碼的複用。

  限制和缺點:它沒有用代碼寫自動化測試用例效率高方便和高複用性。

二: 搭建關鍵字驅動框架的步驟

我把這個過程分成12個步驟:

1.自動化實現一個端對端的流程

2.區分和實現動作關鍵字

3.設置數據引擎-Excel 表

4.實現java反射類

5.設置Java常量,一些固定數據

6.設置元素對象倉庫文件 OR.txt 

7.設置測試套件執行引擎

8.設置日誌輸出模塊,例如log4j

9.設置框架中異常處理

10.設置測試結果報告輸出

11.設置數據驅動

12.完成框架,交付給手工測試人員

下面我們來介紹如何實現第一個步驟:自動化實現一個端對端的流程

什麼是端對端流程呢,這裏舉例一個電商網站場景,你就明白什麼是端對端:

1.登錄系統

2.選擇商品

3.添加商品到購物車

4.檢查支付頁面

5.完成支付過程

6.支付完成後檢查訂單頁面

這就是一個用戶和網站交互的過程,用戶是一段,服務器是另外一端。

Eclipse+ Jave + Selenium:

1)  新建一個SeleniumKeywordDriverFramework的java工程

2)  在src下,點擊右鍵,新建包,包名稱爲executionEngine

3)  在包executionEngine下新建一個class文件,名稱爲DriverScript

 我的IDEA上項目結構如下圖

文件DriverScript.java內容如下,我這裏就是百度登錄舉例,上面步驟是電商網站下單,這個腳本不重要,能模擬點擊和輸入就行。

package executionEngine;
 
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
 
import java.util.concurrent.TimeUnit;
 
public class DriverScript {
     private static WebDriver driver = null;
    public static void main(String[] args) throws InterruptedException {
 
        System.setProperty("webdriver.chrome.driver",".\\libs\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
        driver.get("https://www.baidu.com");
        Thread.sleep(2000);
 
        // 點擊登錄鏈接
        driver.findElement(By.xpath(".//*[@id='u1']/a[text()='登錄']")).click();
 
        // 點擊賬號密碼登錄
        driver.findElement(By.id("TANGRAM__PSP_10__footerULoginBtn")).click();
 
        driver.findElement(By.id("TANGRAM__PSP_10__userName")).sendKeys("xxxxx");
        driver.findElement(By.id("TANGRAM__PSP_10__password")).sendKeys("xxxxx");
        driver.findElement(By.id("TANGRAM__PSP_10__submit")).click();
    }
}

三,識別並設計實現動作關鍵字

單獨創建一個類來管理這些動作關鍵字,這樣,測試腳本就很容易去調用關鍵字相關方法

動作關鍵字就是,利用一個簡短的單詞(詞語)來描述這個動作場景。Action_Keyword:動作的描述關鍵字,例如openBrowser

識別動作關鍵字

1)在Eclipse上,當前項目下新建一個包,包名稱爲dataEngine

2)在dataEngine包下,右鍵選擇新建文件,文件名稱爲dataEngine.xlsx

3)打開dataEngine.xlsx文件,把sheet1重命名爲TestSteps,保存excel文件。

4)在Test Steps中創建以下列字段。

-- TestCase ID: 例如tc_001,auto_001等

-- TestScenario ID:測試場景id,例如TS_001,TS_002等

-- Description: 描述,例如打開瀏覽器

-- Action_Keyword:動作的描述關鍵字,例如openBrowser

      這裏解釋一下測試場景ID和測試用例ID的區別,測試用例,例如登錄這個功能,在登錄功能下有很多測試場景,例如正確用戶名和錯誤密碼登錄,錯誤用戶名和正確密碼登錄,這樣的就是測試場景,所以上面就給了測試場景ID和測試用例ID區分出來。

       在關鍵字命名這塊,建議儘量取一些,有邏輯和有實際意義的單詞,讓別人一看就明白是描述一個什麼的動作場景。例如,打開測試服務器地址,關鍵字可以寫openUrl;在輸入框輸入文字,可以用type或者sendKeys這樣很容易理解的單詞組合。

你的dataEngine.xlsx的內容大概是這個樣子的。

 

實現動作關鍵字

1) 新建一個包,包的名稱是config

2) 在config包下新建一個class文件,命名ActionsKeywords

3) 在ActionsKeywords類中創建多個靜態方法來實現我們excel中寫的這些action_keyword

項目層次結構圖如下

上面這個java類文件具體代碼如下:

package config;
 
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
 
import java.util.concurrent.TimeUnit;
 
public class ActionsKeywords {
 
    public static WebDriver driver;

     * 以下方法,我們針對dataEngine.xlsx文件中的action_keyword這列的關鍵字都進行封裝
     * 等關鍵字框架快設計完了,我們再來調整,讀取配置文件去啓動不同測試瀏覽器和測試地址
     * 這樣就不會代碼寫死這兩個參數。
     */
    public static void openBrowser() {
         // 這裏,我們暫時都寫死用chrome來進行自動化測試
        System.setProperty("webdriver.chrome.driver",".\\libs\\chromedriver.exe");
        driver = new ChromeDriver();
    }
 
    public static void openUrl() {
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get("https://www.baidu.com"); 
    }
 
    public static void click_Login_link() {
        driver.findElement(By.xpath(".//*[@id='u1']/a[text()='登錄']")).click();
        driver.findElement(By.id("TANGRAM__PSP_10__footerULoginBtn")).click();
    }
 
    public static void input_Username() {
        driver.findElement(By.id("TANGRAM__PSP_10__userName")).sendKeys("xxxxx");
    }
 
    public static void input_Password() {
        driver.findElement(By.id("TANGRAM__PSP_10__password")).sendKeys("xxxxx");
    }
 
    public static void click_Submit() {
        driver.findElement(By.id("TANGRAM__PSP_10__submit")).click();
    }
 
    // 關閉瀏覽器並退出
    public static void closeBrowser() {
        driver.quit();
    }
}

四:搭建數據引擎-用Apache POI去讀取數據

在Selenium自動化測試腳本中需要識別Excel中的關鍵字和數據,所以需要利用Java去讀取excel的數據

使用開源jar包工具— Apache POI來讀取Excel文件數據

搭建Data Engine—利用Apache POI

       我們需要一種方式去打開Excel和讀取裏面的數據,並且拿到Selenium自動化測試腳本中。爲了實現這個場景,我這裏使用Apache POI 類庫,Apache POI是一個允許你使用Java去讀取和創建和編輯微軟的Excel文件格式的一種強大的工具包。我們下面要用到相關類或者方法去讀取Excel數據,這些類或者方法是放在‘org.apache.poi.hssf.usermodel’包下。

從Excel中讀取數據

1)下載Apache POIjar包文件,並添加到項目的lib類庫.點擊這裏下載

2)下載後解壓,我們把poi-3.17.jar等添加到項目類庫

 這些包需要添加到項目的librarys中去。

3)新建一個包,名稱爲utility。

4)在utility包下,新建一個類文件,名稱爲ExcelUtils.java

項目代碼結構如下圖

5)在ExcelUtils.java,輸入以下內容

package utility;
 
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
import java.io.FileInputStream;
import java.io.IOException;
 
public class ExcelUtils
    private static XSSFSheet ExcelWSheet;
    private static XSSFWorkbook ExcelWBook;
    private static XSSFCell Cell;
 
    // 設置Excel文件路徑,方便讀取到文件
    public static void setExcelFile(String Path, String SheetName) throws IOException {
        FileInputStream ExcelFile = new FileInputStream(Path);
        ExcelWBook = new XSSFWorkbook(ExcelFile);
        ExcelWSheet = ExcelWBook.getSheet(SheetName);
    }
 
    // 讀取Excel文件單元格數據
    public static String getCellData(int RowNum, int ColNum) throws Exception{
        Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);
        String CellData = Cell.getStringCellValue();
        return CellData;
    }
}

下面,我們來修改DriverScript.java文件裏面的內容,利用上面寫的ExcelUtils類文件,我們在一個一個來讀取進行測試。

package executionEngine;
import config.ActionsKeywords;
import utility.ExcelUtils;
 
public class DriverScript {
 
    public static void main(String[] args) throws Exception {
        String excel_path = "C:\\Users\\ydbj0140\\IdeaProjects\\SeleniumKeywordFramework\\src\\dataEngine\\dataEngine.xlsx";
        // 加載讀取excel文件
        ExcelUtils.setExcelFile(excel_path, "Test Steps");
 
        for (int iRow=1;iRow<=9;iRow++){
            String sActionKeyword = ExcelUtils.getCellData(iRow, 3);


            // 和excel文件中關鍵字進行對比
            if(sActionKeyword.equals("openBrowser")){
                // 如果Excel文件中存在openBrowser的關鍵字就會調用openBrowser()方法,進行相關操作;下面其他關鍵字同理。
                ActionsKeywords.openBrowser();
            } else if(sActionKeyword.equals("openUrl")){
                ActionsKeywords.openUrl();
            } else if(sActionKeyword.equals("click_Login_link")){
                ActionsKeywords.click_Login_link();
            } else if(sActionKeyword.equals("input_Username")){
                ActionsKeywords.input_Username();
            } else if(sActionKeyword.equals("input_Password")){
                ActionsKeywords.input_Password();
            } else if(sActionKeyword.equals("click_Submit")){
                ActionsKeywords.click_Submit();
            } else if(sActionKeyword.equals("closeBrowser")){
                ActionsKeywords.closeBrowser();
            }
        }
    }
}

  測試結果:通過,可以看到登錄百度的效果(這裏登錄後提示輸入驗證碼不是本系列解決的重點,這個問題不用管)。

  到這裏,我們已經實現了一個關鍵字驅動框架的骨架部分,關鍵字驅動框架的重點思路就是如何從Excel文件中讀取和判斷關鍵字,所以,所有的測試用例都可以寫入到Excel文件。但是目前這個框架就是一個草稿,接下來我們要去給這個框架增加一點東西,變得豐滿一點。

五:使用Java反射機制

在前面幾篇文章,我們發現了,如果要運行任何操作,我們需要利用Apache POI去Excel關鍵字這列拿數據並和代碼中相關靜態方法去匹配。到目前,我們就寫了6個關鍵字動作,結果在if-else-if-else中我們需要寫好多個判斷分支,試想一下,如果按照這個思路,一個項目的自動化,有幾百個測試用例,其中一個測試用例有好幾個測試場景,那麼我們的動作關鍵字驅動會寫幾千甚至上萬個,難道也需要寫上萬個if判斷嗎?這樣顯然不合理,效率太低,代碼可維護太差。

使用Java反射類: 在Java中利用反射類是可以解決上面提到的問題。反射是一種非常有用的方法,可以在運行時處理Java類,因此它可以用來裝載Java類、調用它的方法或者在運行時分析類。

反射的作用場景就是:當你添加了新的關鍵字方法代碼,反射類會在運行時間加載所有的方式或者動作關鍵字的類。

ActionsKeywords.java代碼不變和前面文章保持一致。調用selenium的driverScript.java的代碼我們修改如下

package executionEngine;
 
import config.ActionsKeywords;
import utility.ExcelUtils;
import java.lang.reflect.Method;
 
public class DriverScript {
 
    // 聲明一個public static的類對象,所以我們可以在main方法範圍之外去使用。
    public static ActionsKeywords actionKeywords;
    public static String sActionKeyword;
    // 下面是返回類型是方法,這裏用到反射類
    public static Method method[];
 
    // 這裏我們初始化'ActionsKeywords'類的一個對象
    public DriverScript() throws NoSuchMethodException, SecurityException, ClassNotFoundException {
        //actionKeywords = new ActionsKeywords()
     // 原文作者是採用上面這個代碼,下面的代碼是我查找反射資料,是這麼獲取class對象的
        Class<?> actionKeywords = Class.forName("config.ActionsKeywords");
        method = actionKeywords.getMethods();
    }
 
    public static void main(String[] args) throws Exception {
        // 由於上面初始化反射類寫在構造函數,而main方法是第一個被最新,如果不添加
        // 下面這個當前類的初始化代碼,就會報method.length空指針異常,我這裏暫時這裏處理
        // 原文作者不知道爲啥沒有報錯。
        DriverScript ds = new DriverScript();
        String excel_path = "C:\\Users\\Administrator\\Desktop\\SeleniumKeywordDriverFramework\\src\\dataEngine\\dataEngine.xlsx";
        // 加載讀取excel文件
        ExcelUtils.setExcelFile(excel_path, "Test Steps");
 
        for (int iRow = 1; iRow <= 6; iRow++) {
            //3表示excel中keyword對應的列的索引,也就是左邊數起第4列
            sActionKeyword = ExcelUtils.getCellData(iRow, 3);
            //調用'execute_Actions'方法
            execute_Actions();
        }
 
    }
 
    private static void execute_Actions() throws Exception {
        //循環遍歷每一個關鍵字驅動方法(在actionskeywords.java中)
        // 下面method.length表示方法個數,method變量表示任何一個關鍵字方法,例如openBrowser()
        for(int i = 0;i < method.length;i++){
            //開始對比代碼中關鍵字方法名稱和excel中關鍵字這列值是否匹配
            if(method[i].getName().equals(sActionKeyword)){
                //一但匹配到相關關鍵字方法,就會調用對應的關鍵字靜態方法
                method[i].invoke(actionKeywords);
                //一旦任何關鍵字被執行,利用break語句去跳出for循環。
                break;
            }
        }
    }
 
}

 

上面原作者採用new的方式去得到反射類的對象,我改成了forName,但是在main方法第一行還是需要添加創建一個當前driverScript類的對象,否則由於代碼執行順序,先執行main方法,然後執行構造方法,這樣由於actionKeywords沒有初始化,所以聲明的類對象method得到是null,從而method.length報空指針錯誤。

       在使用了Java反射機制之後,上面的代碼要比前面一篇那麼多if-else if要簡潔,好看多了。這樣就不用寫很多判斷分支語句。下面一篇介紹如何把一些常量放在一個類文件,這樣就不用在代碼中寫死,也就是所謂硬編碼問題。

七:對象倉庫

在識別和實現動作關鍵字這篇文章,你一定注意到了,每個元素操作都寫了一個動作關鍵字的靜態方法。如input value in username and passward. 這確實是一個很不好的設計,試着想一下,如果我實際項目中,有很多網頁元素要操作,那麼是不是要寫成千上萬的動作關鍵字呢?很顯然,我們應該對元素對象操作進行分類,例如點擊元素,我們就封裝一個點擊方法,不用在意點擊的元素是什麼。元素文本框輸入也封裝一個元素輸入方法,這樣我們基本上一個點擊和一個輸入動作關鍵字就實現了很多頁面基本操作。

利用面向對象思想,首先我有一個登陸元素,叫login_link,然後這個操作叫點擊,寫一個點擊方法click(),整個元素操作場景就變成了:login_link.click().

 所以,接下里的任務就是如何把動作場景中的對象給分離出來。

爲了實現這個,我們需要使用對象倉庫,對象倉庫就是把所有對象和對象的屬性全部放到一個文件裏面,在webdriver自動化中,driver需要去獲取不同頁面對象的定位方式,從而去定位頁面元素。這個場景,我們很容易使用property 文件來實現。通常的,在Java中,properties文件用來保存一些項目的配置數據和設置參數。在這篇文章,我們就學會如何建立對象倉庫文件並使用這個文件。

步驟1:場景對象倉庫文件

1. 在config包下新建一個文件,名稱叫OR.txt

2. 把之前我們定義的動作關鍵字和元素對象寫入到配置文件,就是鍵值對的形式

3. 這裏我們主要寫頁面元素對象和元素的定位表達式,這裏我們暫時都採用元素的xpath表達式來定位元素。

當前項目結構圖如下

最後你的OR.txt內容大致如下:

# home page
loginLink=.//*[@id='u1']/a[7]
 
# login page
loginTypeByAccount=.//*[@id='TANGRAM__PSP_10__footerULoginBtn']
loginUsernameInputbox=.//*[@id='TANGRAM__PSP_10__userName']
loginPasswordInputbox=.//*[@id='TANGRAM__PSP_10__password']
loginSubmitBtn=.//*[@id='TANGRAM__PSP_10__submit']

 

步驟2:在DriverScript.java中加載OR文件

打開DriverScript.java,在Main方法中添加加載OR文件的代碼,添加後效果如下。

package executionEngine;
import com.sun.xml.internal.bind.v2.runtime.reflect.opt.Const;
import config.ActionsKeywords;
import config.Constants;
import utility.ExcelUtils;
 
import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.util.Properties;
 
public class DriverScript {
    // 聲明一個public static的類對象,所以我們可以在main方法範圍之外去使用。
    public static ActionsKeywords actionsKeywords;
    public static String sActionKeyword;

    // 下面是返回類型是方法,這裏用到反射類
    public static Method method[];
    // 新建一個Properties對象
    public static Properties OR;
    public static String sPageObject;
 
    // 這裏我們初始化'ActionsKeywords'類的一個對象
    public DriverScript() throws NoSuchMethodException, SecurityException{
        actionsKeywords = new ActionsKeywords();
        method = actionsKeywords.getClass().getMethods();
    }
 
    public static void main(String[] args) throws Exception {
        // 初始化一下DriverScript類
        DriverScript ds = new DriverScript();
        String excel_path = Constants.Path_TestData;
        // 申明一個對象倉庫文件字符串的對象
        String Path_OR = Constants.OR_Path;
        // 創建一個文件輸入流對象
        FileInputStream fs = new FileInputStream(Path_OR);
        // 創建一個Properties對象
        OR = new Properties(System.getProperties());
        // 加載全部對象倉庫文件
        OR.load(fs);
 
        // 加載讀取excel文件
        ExcelUtils.setExcelFile(excel_path, Constants.Sheet_TestSteps);
 
        for (int iRow = 1; iRow <= 9; iRow++) {
            //3表示excel中keyword對應的列的索引,也就是左邊數起第4列
            sActionKeyword = ExcelUtils.getCellData(iRow, Constants.Col_ActionKeyword);
            // 獲取對應excel頁面對象的名稱,返回是一個string對象
            sPageObject = ExcelUtils.getCellData(iRow, Constants.Col_PageObject);
            //調用'execute_Actions'方法
            execute_Actions();
        }
    }
 
    private static void execute_Actions() throws Exception {
        //循環遍歷每一個關鍵字驅動方法(在actionskeywords.java中)
        //method variable contain all the method and method.length returns the total number of methods
        // 下面methid.length表示方法個數,method變量表示任何一個關鍵字方法,例如openBrowser()
        for(int i = 0;i < method.length;i++){
            //開始對比代碼中關鍵字方法名稱和excel中關鍵字這列值是否匹配
            if(method[i].getName().equals(sActionKeyword)){
                //一點匹配到關鍵字,並傳遞頁面對象參數和動作關鍵字參數
                method[i].invoke(actionsKeywords,sPageObject);
                //一旦任何關鍵字被執行,利用break語句去跳出for循環。
                break;
            }
        }
    }
 
}

步驟3:Constants.java內容修改後如下

package config;
 
public class Constants {
    // 這裏定義爲public static的類型,方便其他任何類進行訪問和調用, static只能被class訪問
    public static final String URL = "https://www.baidu.com";
    public static final String Path_TestData = ".//src//dataEngine//dataEngine.xlsx";
    public static final String File_TestData = "dataEngine.xlsx";
 
    // dataEngine.xlsx中一些單元格的索引值
    public static final int Col_TestCaseID = 0;
    public static final int Col_TestScenarioID =1;
    public static final int Col_PageObject =3 ;
    public static final int Col_ActionKeyword =4 ;
 
    // DataEngmine.excel中sheet的名稱
    public static final String Sheet_TestSteps = "Test Steps";
 
    // OR(對象倉庫)文件路徑
    public static final String OR_Path =".//src//config/OR.txt";
 
    // 測試登錄用到的用戶數據
    public static final String UserName = "xxxxxx";
    public static final String Password = "xxxxxxx";
}

步驟4:修改dataEngine.xlsx文件,分類對象出來

1. 打開dataEngine.xlsx文件,在Action_Keyword列左側新插入一列

2. 新插入列字段名稱叫 Page Obeject

3. 在Page Object列對應單元格添加元素對象名稱

4. 從之前的Action_keyword列中去除對象,保留動作關鍵字

修改之後的excel內容大致如下:

 

步驟5:修改ActionsKeywords.java類文件

1. 封裝一個click()方法

2. 封裝一個input()方法

 修改之後的ActionsKeywords.java內容如下

package config;
 
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static executionEngine.DriverScript.OR;
 
import java.util.concurrent.TimeUnit;
 
public class ActionsKeywords {
    public static WebDriver driver;
 
    /*
   封裝一個click()方法和input()方法,重點是click()的實現過程
    這裏提一下openUrl和openBrowser方法中爲什麼也要傳入string參數,但是代碼沒有用到這個參數
    這個主要是我們在excel對應單元格不填寫,那麼獲取的string對象就是null,所以這裏參數String object不會影響方法執行 
     */
    public static void openBrowser(String object) {
        // 這裏,我們暫時都寫死用chrome來進行自動化測試
        System.setProperty("webdriver.chrome.driver",".\\libs\\chromedriver.exe");
        driver = new ChromeDriver();
    }
 
    public static void openUrl(String object) {
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get(Constants.URL);
 
    }
 
    public static void click(String object) {
        driver.findElement(By.xpath(OR.getProperty(object))).click();
    }
 
    public static void input(String object) {
        driver.findElement(By.id(OR.getProperty(object))).sendKeys(Constants.UserName);
    }
 
 
    public static void waitFor() throws Exception{
        Thread.sleep(3000);
    }
 
    // 關閉瀏覽器並退出
    public static void closeBrowser() {
        driver.quit();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章