3

CasperJS でラジオ ボタンの値を設定しようとしていますが、うまくいきません。

このテストで assertEval が失敗する理由を誰か説明してもらえますか?

    this.test.assertExist('input[name=main][value=yes]');

    casper.thenEvaluate(function(term) {
        document.querySelector('input[name=main][value=yes]').setAttribute('checked', true);
    });

    this.test.assertEval(function() {
        return document.querySelector('input[name=main][value=yes]').getAttribute('checked') == "true";
    }, 'Main was set to true');
4

1 に答える 1

3

このアサートが失敗する理由を理解するには、 への呼び出しごとcasper.thenに新しいナビゲーション ステップcasper.runが定義され、定義された順序で各ステップが実行されることを理解する必要があります。したがって、casper.thenブロック内のコードは非同期コールバックです。

次のようにコードに注釈を付ける場合:

    this.test.assertExists('input[name=main][value=yes]');

    casper.then(function() {
        this.echo('Select the radio button');
        this.evaluate(function() {
            document.querySelector('input[name=main][value=yes]').setAttribute('checked', true);
        }
    });

    this.echo('Assert that the radio button is selected');
    this.test.assertEval(function() {
        return document.querySelector('input[name=main][value=yes]').getAttribute('checked') == "true";
    }, 'Main was set to true');

「ラジオボタンが選択されていることをアサートする」が「ラジオボタンを選択する」の前に出力されることに気付くでしょう。だからあなたの問題があります!

ソリューション:

thenナビゲーション手順を実行していない場合は、使用する必要がない場合があります。その場合、evaluate代わりにthenEvaluate. または、本当に を使用する必要がある場合は、同じブロックthenに入れます:assertEvalcasper.then

    this.test.assertExists('input[name=main][value=yes]');

    casper.then(function() {
        this.evaluate(function(term) {
            document.querySelector('input[name=main][value=yes]').setAttribute('checked', true);
        });
        this.test.assertEval(function() {
            return document.querySelector('input[name=main][value=yes]').getAttribute('checked') == "true";
        }, 'Main was set to true');
    });
于 2013-04-21T22:20:16.590 に答える