1. 程式人生 > >IDEA+maven+java+TestNG POM+DDT第一篇瀏覽器相容性

IDEA+maven+java+TestNG POM+DDT第一篇瀏覽器相容性

POM=Page Object Model,DDT=Date Driver Test

第一個設計點,就是支援同一個測試用例可以在不同瀏覽器下測試。我們這裡只考慮winodws平臺的瀏覽器,主要是ie和chrome,那到底要怎麼做呢,才能支援一個自動化用例能夠在不同瀏覽器上執行?通過讀取配置檔案的值,來切換不同瀏覽器執行測試指令碼。

設計思路:

1. 寫一個配置檔案,例如properties檔案,裡面寫好瀏覽器的型別和測試伺服器的地址,方便切換

2 .編寫一個瀏覽器引擎類,通過讀取配置檔案加上if語句去控制啟動不同瀏覽器。

3. 測試指令碼呼叫瀏覽器引擎類例項,得到driver,開始測試自動化指令碼

4.利用TestNG編寫一個測試類檔案,測試切換不同瀏覽器是否指令碼執行成功。

IDEA中maven的目錄如下:

1、配置config.properties檔案如上圖,通過註釋和去註釋改變程式的判斷條件;

2、瀏覽器引擎類(BrowserEngine)程式碼如下:

package framework;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class BrowserEngine {

    public String browserName;
    public String serverURL;
    public WebDriver driver;

    public void initConfigData() throws IOException {
       /*Java中有個比較重要的類Properties(Java.util.Properties),主要用於讀取Java的配置檔案,在Java中,其配置檔案常為.properties檔案,格式為文字檔案,檔案的內容的格式是“鍵=值”的格式,
        文字註釋資訊可以用"#"來註釋。主要方法如下:
        getProperty ( String key)  通過引數 key ,得到 key 所對應的 value
        load ( InputStream inStream) 從輸入流中讀取屬性列表(鍵和元素對),以供 getProperty ( String key) 來搜尋
        setProperty ( String key, String value) 呼叫 Hashtable 的方法 put 。他通過呼叫基類的put方法來設定 鍵 - 值對
        store ( OutputStream out, String comments)  與 load 方法相反,該方法將鍵 - 值對寫入到指定的檔案中去。
        clear (),清除所有裝載的 鍵 - 值對
        */

        Properties p=new Properties();
        //載入配置檔案
        InputStream ips=new FileInputStream("E:\\Java_project\\XTPTest_selenium\\suites\\config.properties");
        //InputStream是抽象類,FileInputStream是InputStream的子類
        p.load(ips);

        //日誌

        browserName=p.getProperty("browserName");
        //
        serverURL=p.getProperty("URL");
        //
        ips.close();

    }
    public WebDriver getBrowser(){
        if(browserName.equalsIgnoreCase("chrome")){
            System.setProperty("webdriver.chrome.driver","E:\\Java_project\\XTPTest_selenium\\src\\main\\resources\\chromedriver.exe");
            driver=new ChromeDriver();
            //

        }
        else if(browserName.equalsIgnoreCase("IE")){
            System.setProperty("webdriver.ie.driver","E:\\Java_project\\XTPTest_selenium\\src\\main\\resources\\IEDriverServer.exe");
            driver=new InternetExplorerDriver();
            //
        }
        driver.get(serverURL);
        //
        driver.manage().window().maximize();
        //
        callWait(5);
        return driver;
    }
    public void tearDown() throws InterruptedException{
        //
        driver.quit();
        Thread.sleep(3000);
    }

    //隱式等待
    public void callWait(int time){
        driver.manage().timeouts().implicitlyWait(time,TimeUnit.SECONDS);
        //
    }


}

3、新建一個測試類,測試上面寫的程式碼:

package testsuite;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

import framework.BrowserEngine;
import org.testng.annotations.Test;

import java.io.IOException;

public class TestLaunchBrowser {
    public WebDriver driver;

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

    }
    @Test
    public void clickNews(){
        driver.findElement(By.id("key")).sendKeys("iPhone 7");
        driver.findElement(By.xpath("//*[@id='search']/div/div[2]/button")).click();
    }

    @AfterClass
    public void tearDown(){
        driver.quit();
    }


}

這裡要強調的就是setUp方法中,如何獲取瀏覽器driver這個例項物件並賦值給當前測試指令碼中定義的driver,這個一定要理解好。一句話解釋就是,你在瀏覽器引擎類定義了一個driver物件,在測試指令碼中又定義了一個driver物件,你需要保持整個測試過程,只有一個唯一的driver,否則會報錯,測試指令碼不會執行查詢元素和點選事件。這個建議要好好去理解一下這個為什麼要保持唯一性,為什麼賦值。這個是設計自動化測試框架的核心的一點思想和必須要面臨和解決的問題,參考一個程式只能有一個main方法一樣的道理。