0

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 はフック コールバックからすべての同期を行いますが (両方のログ ステートメントなど)、getCurrentUrlpromise も for もtakeScreenshot解決されません。これは明らかに私が期待したものではありません。

ただし、これらの promise が定義された後 (たとえば の後driver.takeScreenshot()) に例外をスローすると、Mocha は適切なレポートやエラー メッセージを表示せずにすぐに終了することがわかりました (これまでのところ、"Reporter を取得したいのですが、OK)。予期しない例外が発生しました」というメッセージ)、両方の WebDriver promise を解決するため、スクリーンショットが取得され、終了の直前に現在の URL も出力されます。

私はいくつかのテストのみの小さなテスト スイートで遊んでいるので、おそらく Mocha はフックが完了したと見なし、Promise が解決される前に OS に戻ると思いました。別の説明はありますか?ここで私が悪いのですか、それともモカですか? これを正しく修正するにはどうすればよいですか?

PS: それは完全に可能でselenium-webdriverあり、その約束のフレームワークはここで失敗しています。ただし、私は責任を負いたくありませんが、解決策を見つけて、この現象の説明に満足しています.

4

1 に答える 1