我想知道在單擊下載按鈕後,如何使用Selenium Webdriver驗證是否下載了文件。如何使用Selenium/WebdriverIO來下載文件
回答
你的問題沒有說明你想確認它是本地還是遠程(如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
希望這會有所幫助。
TL; DR:除非你的web應用程序具有某種視覺/ GUI觸發一旦下載完成(部分文字,圖像/圖標,字體,推送通知等),那麼答案是響亮的NO。
Webdriver不能超出瀏覽器的範圍,但您的底層框架可以。特別是如果您使用NodeJS。 :)
關閉我的頭頂我可以想到幾種方法,我已經能夠做到這一點在過去。選擇適用:
驗證文件已使用下載節點的File System(又名
fs
)
既然你正在運行WebdriverIO,一個環境的NodeJS下,那麼你可以使用其強大的lib工具套件。我會使用fs.exists
或fs.existsSync
到驗證文件是否在預期的文件夾中。
如果你想成爲勤快的話還結合使用fs.statSync
與fs.exists
& 調查的文件,直到它有預期的大小(如:> 2560 bytes
)
有多種在線的例子,可以幫助你把一起這樣的腳本。使用fs
文檔,但也使用other資源。最後,您可以在您的it
/describe
聲明中添加上述腳本(我記得您使用的是Mocha)。
2.使用
child_process
的exec命令來啓動第三方腳本
雖然這種方法需要設置更多的工作,我覺得從長遠來看更有意義。
!!!警告:除了啓動腳本之外,還需要在第三方框架中編寫腳本。
注:上述所有的框架可以生成一個.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即可進行迴歸運行。
- 1. 使用jQuery和iframe來下載文件
- 2. 使用iframe來下載文件
- 3. 如何使用twisted來下載遠程文件?
- 4. 如何使用代理服務器來下載文件
- 5. 如何使用RETS連接器來下載一個CSV文件
- 6. 如何使用primefaces樹來下載文件
- 7. 如何使用玩笑來測試文件下載?
- 8. 如何使用錨標記來下載文件<a>
- 9. 如何使用Perl下載文件?
- 10. 如何使用ajax window.location下載文件
- 11. 如何使用FileResult下載文件?
- 12. 如何使用jxbrowser庫下載文件?
- 13. Laravel如何使用Response下載文件?
- 14. 如何使用window.fetch下載文件?
- 15. 如何使用AFNetworking 2.0下載文件
- 16. 如何使用http包下載文件?
- 17. 如何使用StreamingOutput下載CSV文件
- 18. 如何使用jquery下載csv文件?
- 19. 如何使用angularjs下載文件?
- 20. 如何使用AngularJS下載文件?
- 21. 如何使用send_file下載文件?
- 22. 如何使用angularjs下載zip文件
- 23. 如何使用Watir 6.0下載文件
- 24. 如何使用Jersey下載PDF文件?
- 25. 如何使用HTMLAgilityPack下載CSV文件?
- 26. 如何使用PHP下載msg文件
- 27. 如何使用msbuild下載文件?
- 28. 如何使用CA-VO下載文件
- 29. 如何使用C#下載XML文件?
- 30. 如何使用HTTPBuilder(HttpClient)下載文件?
嘿男人,我清楚地知道,事情是,我在我的系統中推入一些下載按鈕,然後文件開始下載,但我不知道這個文件有哪個名稱。如果我使用fs.exists,我需要通過正確的名稱?那麼在下載開始後如何抓住這個名字呢? –
嗨@iamdanchiv,是的,我知道的是越來越不容易,文件改名,如果我選擇不同的行,我怎麼能捕捉到的文件名,如果我想使用硒WDIO與Chrome或Firefox?我已經知道文件在哪裏存儲。這是一個截屏http://take.ms/UjZQL –
喔@iamdanchiv,對不起,我想你missunderstood我嘿嘿,我知道我可以在一個變量保存文件名,那麼在下載文件夾中的文件名比較名稱,如果存在好,對我來說不壞。我的意思是,如果我沒有預定義的名稱來存儲變量並在下載文件夾中搜索,那麼當它開始使用webdriverIO進行下載時,如何捕獲文件的名稱? –