簡體   English   中英

如何使用CasperJS提交列表中的項目

[英]How to submit items in a list using CasperJS

我正在嘗試在每行都有一個動作鏈接按鈕的網格中進行迭代。 我需要單擊此按鈕,然后返回到網格,然后單擊下一行上的按鈕。

請參閱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()

您不恰當地混合了同步和異步功能。 您可以使用循環,因為您事先知道迭代的次數,但是問題可能是您在執行第一個waitForSelector()步驟之前就單擊了每個item

then*()所有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引用指向最后一個可能的i 在此處查看更多信息: 循環內的JavaScript閉合–簡單的實際示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM