1. 程式人生 > >Selenium高階|單條用例執行截圖

Selenium高階|單條用例執行截圖

在使用Selenium做自動化測試的過程中,經常需要用到截圖的功能,比如用例執行失敗後截圖,通過截圖可以一目瞭然的知道系統究竟發生了什麼問題;也可以在關鍵的驗證點執行成功後截圖,做為用例執行成功的證據(Evidence)。

本篇文章重點給大家介紹Selenium截圖的核心方法。

實現截圖功能用到的Selenium的核心類如下:

org.openqa.selenium.TakesScreenshot   此類可以完成截圖操作

org.openqa.selenium.io.FileHandler 此類可以完成將截圖檔案儲存到指定的路徑下

用到的Java概念:

Casting物件轉型,將物件由一種型別轉換為另一種型別。

具體思路如下:

1. 將driver物件由WebDriver型別轉型成TakesScreenshot型別

這樣做是因為需要用到getScreenshotAs()這個方法實現截圖,但是這個方法在WebDriver這個類裡是沒有的,這裡就可以通過Java提供的Casting概念,將driver物件由WebDriver型別轉型成TakesScreenshot型別,這樣就能呼叫getScreenshotAs()這個方法實現截圖了。

TakesScreenshot srcShot = (TakesScreenshot) driver;

2. 呼叫getScreenshotAs()實現截圖

File srcFile = srcShot.getScreenshotAs(OutputType.FILE);

3. 將截圖儲存到指定磁碟路徑

這裡將截圖儲存到了D盤ScreenShots資料夾下並命名為srcShots.png

File desFile = new File("D:\\ScreenShots\\srcShots.png");

4. 藉助Selenium的FileHandler類實現將截圖複製到指定路徑下

 FileHandler.copy(srcFile, desFile);

注:有些指令碼中用到了FileUtils實現拷貝功能,這個需要用到apache的一個jar包(commons-io),在Selenium3.9.0之前的版本中是不需要特別引入相關jar包的,但是以後的版本需要特別引入這個apache的jar包才可以使用。

下面是一個完整的用例指令碼

用例場景如下:

1. 啟動火狐瀏覽器

2. 開啟百度首頁

3. 在搜尋框輸入selenium關鍵字

4. 點選“百度一下”按鈕(為了製造失敗的場景把按鈕的id屬性寫成了錯誤的)

該步驟失敗後,會進入到try...catch語句的catch部分,在catch部分呼叫了具體實現截圖的方法getScreenShot(),從而實現了失敗後的截圖。

具體指令碼如下:

package learnwebdriver;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;


import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;

import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.io.FileHandler;


public class TakeScreenShot {
	
	public static WebDriver driver;

	public static void main(String[] args) throws InterruptedException, IOException {
		
	//定義gecko driver的獲取地址
        System.setProperty("webdriver.gecko.driver", "D:\\BrowserDriver\\geckodriver.exe");
		
       //建立一個叫driver的物件,啟動火狐瀏覽器  
       driver = new FirefoxDriver();
       
       driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
       
       //通過物件driver呼叫具體的get方法來開啟網頁
       driver.get("https://www.baidu.com/");
       
       //最大化瀏覽器視窗
       driver.manage().window().maximize();
       
       //輸入查詢關鍵字
       driver.findElement(By.id("kw")).sendKeys("selenium");
       		
	   
       try {
       //點選查詢按鈕,此處id給了錯誤的所以失敗後會走到catch分支進行截圖
       driver.findElement(By.id("su112233")).click();
    
       } catch(Exception e) {
    	   
    	   //失敗後呼叫下面的getScreenShot方法進行截圖
    	   TakeScreenShot shot = new TakeScreenShot(); 
    	   shot.getScreenShot();
       }
            
		
		driver.quit();
		

	}
	
	//此方法具體實現截圖功能
	public void getScreenShot() throws IOException {
		
		//將WebDriver型別的物件轉換成TakesScreenshot型別的物件,以方便用它的抓圖的方法
		TakesScreenshot srcShot = (TakesScreenshot) driver;
		
		//利用getScreenshotAs()實現截圖並將截圖儲存到srcFile中
	    File srcFile = srcShot.getScreenshotAs(OutputType.FILE);
	    
	    File desFile = new File("D:\\ScreenShots\\srcShots.png");
	    
	    //FileUtils.copyFile(srcFile, desFile);
	    
	    FileHandler.copy(srcFile, desFile);
		
		
	}

}

截到的圖片如下:

【完成】

****************************************************************************************************

最近我會持續更新Selenium Java的相關文章,也請大家多多關注我的視訊課程

全網最新、最完整、最具價效比的自動化測試課程

*****************************************************************************************************