0

各行にアクションリンクボタンがあるグリッドで反復しようとしています。このボタンをクリックしてグリッドに戻り、次の行のボタンをクリックする必要があります。

CasperJS スクリプトを参照してください。

for(var i=1; i<lines.length; i++) {

    var element = this.getElementInfo(x('//*[@id="elx"]/tbody/tr[' + i +']/td[1]'));
    var item = x('//*[@id="gdvConsulta"]/tbody/tr[' + i +']/td[3]/a');

    var model = {
        'custom': element.text,
        'item': item.text
    };

    // Click on item
    casper.click(item);
    this.waitForSelector(x('//*[@id="grid"]'),
        function pass () {
            utils.dump('ok');
            var backbutton = x('//*[@id="back"]/a');

            casper.click(backbutton);
        },
        function fail () {
            utils.dump('error');
        }
    );

    utils.dump('done line');
}

注: ループの最初の反復をクリックする前に、すべての行に対して「完了行」というメッセージが出力されました。

waitForSelector()次の反復に行かずに実数を作成する方法は?

4

1 に答える 1

1

同期関数と非同期関数を不適切に混在させています。反復回数が事前にわかっているため、ループを使用できますがitem、最初のwaitForSelector()ステップが実行される前にすべてをクリックしていることが問題になる場合があります。

then*()関数と関数はすべてwait*()非同期ステップ関数です。それらを呼び出すことにより、現在のステップの後に実行されるステップをスケジュールします。次のような手順で同期コードをラップする必要があります。

for(var i=1; i<lines.length; i++) {
    (function(i){
        casper.then(function(){
            var element = this.getElementInfo(x('//*[@id="elx"]/tbody/tr[' + i +']/td[1]'));
            var item = x('//*[@id="gdvConsulta"]/tbody/tr[' + i +']/td[3]/a');

            // Click on item
            casper.click(item);
        });


        casper.waitForSelector(x('//*[@id="grid"]'),
            function pass () {
                utils.dump('ok');
                var backbutton = x('//*[@id="back"]/a');

                casper.click(backbutton);
                utils.dump('done line');
            },
            function fail () {
                utils.dump('error');
            }
        );
    })(i);
}

iループの内部は非同期で実行され、すべてのi反復の参照は可能な最後の. 詳細はこちら:ループ内の JavaScript クロージャー – 簡単な実用例i

于 2015-07-23T20:25:08.907 に答える