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

时间:2014-10-19 17:14:15

标签: javascript phantomjs casperjs

我正在尝试在评估页面上单击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);

1 个答案:

答案 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);
}

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