3

インターフェイス テストでカバーしたい AJAX ベースの JavaScript アプリケーションがあります。たとえば、Web サイトを (特定の URL から) ロードし、いくつかの DOM 要素 (特定の ID と特定のクラス) が存在するかどうかを確認するテストを作成したいと考えています。

問題は、ブラウザに URL を入力すると、アプリケーションにLoading...ラベルが表示され、その下に AJAX リクエストが送信されることです。AJAX 応答が到着すると、いくつかの処理が行われ、適切な Web ページ コンテンツが表示されます (Loading...ラベルは非表示になります)。これまでのところ、私はこのコードを持っています:

casper.test.begin('Main page test', 2, function suite(test) {

    casper.start('http://xxx.yyy.zzz/', function() {
        test.assertTitle('My page name', 'page title is set correctly');
    });

    casper.then(function() {
        test.assertExists('#tabsListArea', 'tabs area is found');
    });

    casper.run(function() {
        test.done();
    });
});

これは私が得るエラーメッセージです:

FAIL tabs area is found
#    type: assertExists
#    file: mypath/.../casperjs/casper-test.js:11
#    code: test.assertExists('#tabsListArea', 'tabs area is found');
#    subject: false
#    selector: "#tabsListArea"
⚠  looks you did not use begin() which is mandatory since 1.1

すべてのアサーションを作成できるように、AJAX 応答が到着して JS エンジンによって処理されるまで、phantomjs/casperjs を待機させるにはどうすればよいか教えてください。

4

1 に答える 1

3

waitFor 関数のいずれかを試しましたか。次のようなことを試すことができます:

casper.test.begin('Main page test', 2, function suite(test) {

    casper.start('http://xxx.yyy.zzz/', function() {
        test.assertTitle('My page name', 'page title is set correctly');
    });

    casper.waitFor(function check() {
        return this.evaluate(function() {
            return $('loading label').is('hidden');
        });
    }, function then() {    // step to execute when check() is ok
        test.assertExists('#tabsListArea', 'tabs area is found');
    }, function timeout() { // step to execute if check has failed
        this.echo("Timeout: page did not load in time...").exit();
    });

    casper.run(function() {
       test.done();
   });
});

次に、waitTimeout オプションをいじって、ページの読み込みに十分な時間を与えることができます。これは完全な解決策ではありませんが、この場合はうまくいく可能性があります。

于 2013-07-30T16:16:58.487 に答える