PhantomJS (経由selenium-webdriver
) と Mocha を使用してテスト スイートを作成しています。レポートには、テストが失敗するたびにスクリーンショットが必要なので、レポーターに基づいて Mocha 用のカスタム レポーターを作成しましたspec
。
module.exports = Screenshot;
var Spec = require('mocha/lib/reporters/spec');
var fs = require('fs');
// custom library generating PhantomJS instances
var phantoms = require("phantoms");
function Screenshot(runner) {
Spec.call(this, runner);
runner.on('fail', function(test, err){
var driver = phantoms.getDriver();
driver.getCurrentUrl().then(function(url) {
console.log(url);
});
console.log('This works');
driver.takeScreenshot().then(function(img) {
console.log("Writing screenshot");
fs.writeFileSync("/tmp/selenium.png", img, 'base64');
return "/tmp/selenium.png";
});
console.log('This also works');
});
}
Screenshot.prototype.__proto__ = Spec.prototype;
テストが失敗すると、面白い状況が発生します。Mocha はフック コールバックからすべての同期を行いますが (両方のログ ステートメントなど)、getCurrentUrl
promise も for もtakeScreenshot
解決されません。これは明らかに私が期待したものではありません。
ただし、これらの promise が定義された後 (たとえば の後driver.takeScreenshot()
) に例外をスローすると、Mocha は適切なレポートやエラー メッセージを表示せずにすぐに終了することがわかりました (これまでのところ、"Reporter を取得したいのですが、OK)。予期しない例外が発生しました」というメッセージ)、両方の WebDriver promise を解決するため、スクリーンショットが取得され、終了の直前に現在の URL も出力されます。
私はいくつかのテストのみの小さなテスト スイートで遊んでいるので、おそらく Mocha はフックが完了したと見なし、Promise が解決される前に OS に戻ると思いました。別の説明はありますか?ここで私が悪いのですか、それともモカですか? これを正しく修正するにはどうすればよいですか?
PS: それは完全に可能でselenium-webdriver
あり、その約束のフレームワークはここで失敗しています。ただし、私は責任を負いたくありませんが、解決策を見つけて、この現象の説明に満足しています.