背景
Selenium を使って Headless Chrome で E2E テストを行う場合に、ファイルをダウンロードできるかどうか、ダウンロードしたファイルが正しいかどうかをテストしたい場合があります。このとき、Chrome に適切なオプションを渡すことでダウンロード先を指定します。 このとき、素の Chrome と Headless Chrome では指定の仕方が異なるので、その方法をまとめます。
解決策
Headless Chrome の場合、selenium に対して send_comand
によってパラメータを登録する必要があります。
downloadPath
に対して、ダウンロード先のパスを設定します。
const fetch = require('node-fetch');
browser.getSession().then((session) => {
const sessionId = session['id_'];
fetch('http://localhost:4444/wd/hub/session/'+ sessionId + '/chromium/send_command', {
method: 'POST',
body: JSON.stringify({
'cmd': 'Page.setDownloadBehavior',
'params': {'behavior': 'allow', 'downloadPath': './path/to/download' }
}),
});
});
ここでは、 selenium へ HTTP リクエストを送信するのに node-fetch
を使っています。 await/async を使わずにそのまま Promise を処理しています。他の HTTP ライブラリを使ったり、 await/async で書くことも可能です。
参考: 素の Chrome の場合
capabilities = {
browserName: "chrome",
chromeOptions: {
prefs: {
'download': {
'prompt_for_download': false,
'directory_upgrade': true,
'default_directory': './path/to/download',
}
}
},
};
default_directory
に対して、ダウンロード先のパスを設定します。