Javascript 使用CasperJS在评估页面上单击对象

Javascript 使用CasperJS在评估页面上单击对象,javascript,phantomjs,casperjs,Javascript,Phantomjs,Casperjs,我正在尝试单击评估页面上的x个对象,但经过一整天的尝试后失败了。。我有以下代码,您可以看到我在变量(称为itemsToAdd)中建立了一个对象列表,然后我需要将其传递到评估页面,然后单击这些对象 我知道您无法将复杂对象传递到评估页面,但我尝试的每一次尝试都失败了。。我什么都试过了,请帮忙。我也尝试过自定义js文件,尽管我也无法让它工作 $(function(ns) { ns.myMethod = function(itemArray) { var items = item

我正在尝试单击评估页面上的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'));
调用代码

var itemsToAdd = {
    'items': [
        {
            buttonId: '#button1',
            basketId: '#nowInBasket1',
            successMessage: 'It worked'
        },
        {
            buttonId: '#button2',
            basketId: '#nowInBasket2',
            successMessage: 'this worked aswell'
        }
    ]
};
test.myMethod(itemsToAdd);

您的代码存在多个问题

evaluate
是沙盒页面上下文。其中没有可访问的CasperJS或PhantomJS函数。但是它看起来不像是在使用页面上下文,所以应该将
然后evaluate
更改为
然后
。我写了一篇文章,展示了您可以使用
评估
函数/页面上下文进行哪些操作

JavaScript具有函数作用域。阅读本文了解更多信息。这意味着在循环执行完所有
i
s之后,指向最后一个
i
。您需要一个闭包来解决这个问题(这里我使用一个IIFE,但是您也可以将循环更改为
itemArray.items.forEach(…

var items=itemArray.items;
对于(i=0;i

如果这不能解决您的问题,那么这可能是您的
$
框架的问题,不管是什么。

您使用的是自定义测试框架(
$
)或者它是在某个地方发布的?你能链接到它吗?还没有,显然我们有jquery.jquery在页面上下文中是有意义的,但在casper上下文中没有。casper上下文中没有DOM,所以大多数jquery函数都会被破坏。我不确定何时使用evaluate或thenevaluate..有什么区别吗?你不能返回带有
t的任何内容henEvaluate
因此它作为一个void函数执行,但异步执行(调度一个步骤)。
evaluate
立即执行。
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);
}