我正在尝试在评估页面上单击x个对象,但是在整天星期天尝试后它都失败了。我有以下代码,你可以看到我在我的变量中建立一个对象列表(称为itemsToAdd)然后我需要将它传递到评估页面,然后再点击那些对象。
我知道你不能将复杂的对象传递给评估的页面,但我尝试过的每一次尝试都失败了..我已经尝试了一切,请帮忙。我也尝试过自定义js文件,虽然我也无法正常工作。
$(function(ns) {
ns.myMethod = function(itemArray) {
var items = itemArray.items;
for (i = 0; i < items.length; i++) {
casper.thenEvaluate(function() {
casper.click(items[i].buttonId);
casper.waitUntilVisible(items[i].basketId, function() {
casper.echo(items[i].successMessage);
});
});
}
return this;
};
})(namespace('test'));
这是我的变量,buttonId是评估页面上按钮的DOM ID。 basketId是评估页面上的另一个部分,它被更新以表示点击按钮已经工作。
复杂变量
var itemsToAdd = {
'items': [
{
buttonId: '#button1',
basketId: '#nowInBasket1',
successMessage: 'It worked'
},
{
buttonId: '#button2',
basketId: '#nowInBasket2',
successMessage: 'this worked aswell'
}
]
};
调用代码
test.myMethod(itemsToAdd);
答案 0 :(得分:0)
您的代码存在多个问题。
evaluate
是沙盒页面上下文。内部没有可访问的CasperJS或PhantomJS功能。但它看起来并不像您正在使用页面上下文,因此您应该将thenEvaluate
更改为then
。我写了帖子here,其中显示了您可以使用evaluate
函数/页面上下文的内容。
JavaScript具有功能范围。阅读此question以了解更多信息。这意味着在循环执行完所有i
s指向最后i
之后。你需要一个闭包来解决这个问题(这里我使用的是IIFE,但你也可以将循环更改为itemArray.items.forEach(...
)。
var items = itemArray.items;
for (i = 0; i < items.length; i++) {
(function(i){
casper.then(function() {
casper.click(items[i].buttonId);
casper.waitUntilVisible(items[i].basketId, function() {
casper.echo(items[i].successMessage);
});
});
})(i);
}
如果这不能解决您的问题,那么这可能是您的$
框架的问题,无论是什么。