1. 程式人生 > >Java+Selenium3框架設計篇1-跨瀏覽器支援

Java+Selenium3框架設計篇1-跨瀏覽器支援

          本篇開始介紹Java+Selenium+POM的簡單自動化測試框架設計。第一個設計點,就是支援跨瀏覽器測試。從我個人角度來說,跨瀏覽器測試就是:同一個測試用例,支援用不同瀏覽器去執行。我們這裡只考慮winodws平臺的瀏覽器,而且只關注火狐和谷歌瀏覽器的自動化測試,我們已經知道IE執行很慢,而且容易出問題。那到底要怎麼做呢,才能支援一個自動化用例能夠在不同瀏覽器上執行?我是通過讀取配置檔案的值,來切換不同瀏覽器執行測試指令碼。

開發思路:

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

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

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

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

eclipse專案結構如下圖。

配置檔案config.properties內容如下

# browser switcher
#browserName = Firefox
browserName = Chrome
#browserName = IE

# test server switcher
URL=http://re.jd.com/
#URL=https://taobao.com

通過取消前面註釋標記#符號,我們可以一次只執行一個瀏覽器平臺測試,測試地址的切換也是同樣道理。

瀏覽器引擎類程式碼如下:

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.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class BrowserEngine {
	
	public String browserName;
	public String serverURL;
	public WebDriver driver;
	
	public void initConfigData() throws IOException{
		
		Properties p = new Properties();
		// 載入配置檔案
		InputStream ips = new FileInputStream(".\\TestConfig\\config.properties");
		p.load(ips);
		
		Logger.Output(LogType.LogTypeName.INFO, "Start to select browser name from properties file");
		browserName=p.getProperty("browserName");
		Logger.Output(LogType.LogTypeName.INFO, "Your had select test browser type is: "+ browserName);
		serverURL = p.getProperty("URL");
		Logger.Output(LogType.LogTypeName.INFO, "The test server URL is: "+ serverURL);
		ips.close();
		
	}
	
	public WebDriver getBrowser(){
		
		if(browserName.equalsIgnoreCase("Firefox")){
			
			System.setProperty("webdriver.gecko.driver", ".\\Tools\\geckodriver.exe");	
			driver = createFireFoxDriver();
			
			Logger.Output(LogType.LogTypeName.INFO, "Launching Firefox ...");
			
		}else if(browserName.equalsIgnoreCase("Chrome")){
			
			System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");
			driver= new ChromeDriver();
			Logger.Output(LogType.LogTypeName.INFO, "Launching Chrome ...");
			
		}else if(browserName.equalsIgnoreCase("IE")){
			
			System.setProperty("webdriver.ie.driver", ".\\Tools\\IEDriverServer.exe");
			driver= new InternetExplorerDriver();
			Logger.Output(LogType.LogTypeName.INFO, "Launching IE ...");
		}
		
		driver.get(serverURL);
		Logger.Output(LogType.LogTypeName.INFO, "Open URL: "+ serverURL);
		driver.manage().window().maximize();
		Logger.Output(LogType.LogTypeName.INFO, "Maximize browser...");
		callWait(5);
		return driver;
	}
	
	/*
	 * 關閉瀏覽器並退出方法
	 */
	
	public void tearDown() throws InterruptedException{
		
		Logger.Output(LogType.LogTypeName.INFO, "Closing browser...");
		driver.quit();
		Thread.sleep(3000);
	}
	
	/*
	 * 隱式時間等待方法
	 */
	public void callWait(int time){
		
		driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS);
		Logger.Output(LogType.LogTypeName.INFO, "Wait for "+time+" seconds.");
	}
	
	
	/*
	 * createFireFox Driver
	 * @Param: null
	 * @return: WebDriver
	 */
	
	private WebDriver createFireFoxDriver() {
		
		WebDriver driver = null;
		FirefoxProfile firefoxProfile = new FirefoxProfile();

		firefoxProfile.setPreference("prefs.converted-to-utf8", true);
		//set download folder to default folder: TestDownload
		firefoxProfile.setPreference("browser.download.folderList", 2);
		firefoxProfile.setPreference("browser.download.dir", ".\\TestDownload");
		
		try {
				driver = new FirefoxDriver(firefoxProfile);
		} catch (Exception e) {
			Logger.Output(LogType.LogTypeName.ERROR, e.getMessage());
			Logger.Output(LogType.LogTypeName.ERROR, "Failed to initilize the Firefox driver");
		}
		return driver;
	}

	
}

日誌輸入,我採用java方法,沒有用log4j,如果日誌這塊出錯,請回到前面純java方式生成日誌這篇檔案去學習下。

新建一個測試類,內容如下,開啟京東

package testSuite;

import java.io.IOException;

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

import framework.BrowserEngine;

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方法一樣的道理。