2017-07-07 188 views

回答

0

你的問題沒有說明你想確認它是本地還是遠程(如browserstack)。如果它是遠程的,那麼我的答案將是「NO」,因爲您可以看到該文件正在下載,但無法訪問該文件夾。所以你不能斷言該文件已被下載。

如果你想在本地(在Chrome)實現這一那麼答案是「YES 」,你可以做這樣的事情:

在wdio.conf.js(要知道它在哪裏得到下載)

var path = require('path'); 

const pathToDownload = path.resolve('chromeDownloads'); 

// chromeDownloads above is the name of the folder in the root directory 
exports.config = { 
capabilities: [{ 
     maxInstances: 1,  
     browserName: 'chrome', 
     os: 'Windows',  
     chromeOptions: { 
      args: [ 
       'user-data-dir=./chrome/user-data', 
      ], 
      prefs: { 
       "download.default_directory": pathToDownload, 
      } 
     } 
    }], 

而且你的spec文件(要檢查的文件被下載或不)

const fsExtra = require('fs-extra'); 
const pathToChromeDownloads = './chromeDownloads'; 

describe('User can download and verify a file',() =>{ 

    before(() => { 
     // Clean up the chromeDownloads folder and create a fresh one 
     fsExtra.removeSync(pathToChromeDownloads); 
     fsExtra.mkdirsSync(pathToChromeDownloads); 
    }); 

    it('Download the file',() =>{ 
     // Code to download 
    }); 

    it('Verify the file is downloaded',() =>{ 
     // Code to verify 
     // Get the name of file and assert it with the expected name 
    }); 
}); 

更多關於FS-EXTRA:https://www.npmjs.com/package/fs-extra

希望這會有所幫助。

1

TL; DR:除非你的web應用程序具有某種視覺/ GUI觸發一旦下載完成(部分文字,圖像/圖標,字體,推送通知等),那麼答案是響亮的NO

Webdriver不能超出瀏覽器的範圍,但您的底層框架可以。特別是如果您使用NodeJS。 :)

關閉我的頭頂我可以想到幾種方法,我已經能夠做到這一點在過去。選擇適用:

驗證文件已使用下載節點的File System(又名fs

既然你正在運行WebdriverIO,一個環境的NodeJS下,那麼你可以使用其強大的lib工具套件。我會使用fs.existsfs.existsSync驗證文件是否在預期的文件夾中。

如果你想成爲勤快的話還結合使用fs.statSyncfs.exists & 調查的文件,直到它有預期的大小(如:> 2560 bytes

有多種在線的例子,可以幫助你把一起這樣的腳本。使用fs文檔,但也使用other資源。最後,您可以在您的it/describe聲明中添加上述腳本(我記得您使用的是Mocha)。

2.使用child_processexec命令來啓動第三方腳本

雖然這種方法需要設置更多的工作,我覺得從長遠來看更有意義。

!!!警告:除了啓動腳本之外,還需要在第三方框架中編寫腳本。

  • 使用的AutoIT腳本;
  • 使用Sikuli腳本;
  • 使用TestComplete(不鏈接它,我不喜歡那麼多),或者[在這裏插入GUI驗證腳本]腳本;

注:上述所有的框架可以生成一個.exe文件,您可以從您的WebdriverIO的測試用例觸發,以檢查您的文件是否已經被下載,還是不行。

採取的步驟:

  • 創建像上面提到的獨立腳本之一;
  • 將腳本的.exe文件放入項目中的已知文件夾中;
  • 使用child_process.exec來啓動腳本並在其結束執行後聲明其結果;

例子:

exec = require('child_process').exec; 
// Make sure you also remove the .exe from scriptName 
var yourScript = pathToScript + scriptName; 

var child = exec(yourScript); 
child.on('close', function (code, signal) { 
    if (code!==0) { 
     callback.fail(online.online[module][code]); 
    } else { 
     callback(); 
    } 
}); 

最後:我敢肯定還有其他的方法來做到這一點。但是,從這個模糊的問題中,您主要應該知道的是:如果您絕對必須下載該文件,則可以驗證該文件是否已下載,特別是如果此測試用例爲CRITICAL即可進行迴歸運行。

+0

嘿男人,我清楚地知道,事情是,我在我的系統中推入一些下載按鈕,然後文件開始下載,但我不知道這個文件有哪個名稱。如果我使用fs.exists,我需要通過正確的名稱?那麼在下載開始後如何抓住這個名字呢? –

+0

嗨@iamdanchiv,是的,我知道的是越來越不容易,文件改名,如果我選擇不同的行,我怎麼能捕捉到的文件名,如果我想使用硒WDIO與Chrome或Firefox?我已經知道文件在哪裏存儲。這是一個截屏http://take.ms/UjZQL –

+0

喔@iamdanchiv,對不起,我想你missunderstood我嘿嘿,我知道我可以在一個變量保存文件名,那麼在下載文件夾中的文件名比較名稱,如果存在好,對我來說不壞。我的意思是,如果我沒有預定義的名稱來存儲變量並在下載文件夾中搜索,那麼當它開始使用webdriverIO進行下載時,如何捕獲文件的名稱? –