[英]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.