2017-06-06 26 views
0

我正在嘗試使用量角器中的通用方法保存屏幕截圖。兩個功能,它創建文件夾,如果它不存在,它會保存文件(在某些條件下)。使用量角器保存屏幕截圖

export function WriteScreenShot(data: string, filename: string) { 
    let datetime = moment().format('YYYYMMDD-hhmmss'); 
    filename = `../../../test-reports/${filename}.${datetime}.png`; 

    let path =filename.substring(0, filename.lastIndexOf('/')); 
    if (!fs.existsSync(path)) { 
     fs.mkdirSync(path); 
    } 

    let stream = fs.createWriteStream(filename); 
    stream.write(new Buffer(data, 'base64')); 
    stream.end(); 
} 

這可以通過調用browser.takeScreenshot().then(png => WriteScreenShot(png, 'login/login-page'));使用這個例子調用中使用一個文件將被創建,我認爲,在相對路徑在我的WriteScreenShot方法的文件駐留英寸但似乎並非如此。

例如,當我在spec的文件夾中運行我的spec測試時,圖像被保存在正確的位置。但是,如果我在項目根目錄下運行它,則會捕獲錯誤。顯然,這與我的相對路徑引用有關。我如何捕獲項目的根目錄並從中建立,以便我可以從任何目錄運行測試?

+0

您可以舉一個例子說明如何以及從何處運行配置?有幾種方法可以做到這一點,但是從運行腳本的位置可以確定最佳解決方案 – wswebcreation

回答

1

這是一個古典的目錄訪問錯誤。讓我解釋一下什麼是發生在你的代碼 -

let path =filename.substring(0, filename.lastIndexOf('/')); 

以上線路輸出到../../../test-reports

fs.existsSync檢查該path是否存在 -

情況下1:(陽性流)您的spec文件夾位於您嘗試創建報告文件夾的當前工作目錄中。當您運行測試時,路徑存在,它會生成test-reports目錄&屏幕截圖,並且您的代碼正常工作。

案例2:(負流量)當您嘗試從根目錄也就是現在的當前工作目錄中運行它,fs.existsSync試圖檢查路徑&的報告裏面的文件夾。如果它不存在,fs.mkdirSync會嘗試創建您的目錄,但它會失敗,因爲它無法創建多個目錄。

您應該使用的的NodeJS本地路徑模塊提取路徑,而不是使用文件子和創建多個目錄中mkdirp外部模塊。

import * as path from 'path'; 
let {mkdirp} = require('mkdirp'); // npm i -D mkdirp 

export function WriteScreenShot(data: string, filename: string) { 
    let datetime = moment().format('YYYYMMDD-hhmmss'); 
    filename = `../../../test-reports/${filename}.${datetime}.png`; 

    let filePath = path.dirname(filename); // output: '../../..' (relative path) 
      // or 
    let filePath = path.resolve(__dirname); // output: 'your_root_dir_path' (absolute path) 
      // or 
    let filePath = path.resolve('.'); // output: 'your_root_dir_path' (absolute path) 

    if (!fs.existsSync(filePath)) { 
     mkdirp.sync(filePath); // creates multiple folders if they don't exist 
    } 

    let stream = fs.createWriteStream(filename); 
    stream.write(new Buffer(data, 'base64')); 
    stream.end(); 
} 

如果你想知道的區別BTW mkdir & mkdir-p請詳細閱讀本SO thread

+0

我還找到了app-root-path模塊。 – Machtyn