在CasperJS中使用动态名称填充字段

时间:2014-12-11 12:37:49

标签: javascript global-variables casperjs

我可以成功登录网站,然后填写表格并获得结果。 现在我试图为使用我的应用程序的任何人这样做。问题是我必须填写的表单有一个字段名称,该名称会更改为用户数。

像这样:

casper.thenOpen('http://www.foo.com/index.html', function() {
    this.fill('form[action="/cgi-bin/login.cgi"]', { login: user,password:pass }, true);
    this.click('input[type="submit"][name="enter"]');
    this.wait(5000,function(){
        this.capture('eff_ss2.png');
    });
});

一切都很好,直到这里(我阅读登录并通过casper.cli.raw.get(); 然后我这样做:

this.fill('form[action="../foo.cgi"]', { 
    'from_city':            ori,
    'to_city':          dest,
    'plan_03231':       'whatev',
    'aspp_03231':       'whatev'
}, true);

03231将根据登录用户而变化。如何动态执行此操作?我已经尝试过了:

var plan = 'plan_0'+user;
var obj{}
obj[plan] = 'whatev'

this.fill('form[action="../foo.cgi"]', { 
    'from_city':            ori,
    'to_city':          dest,
    obj,
    'aspp_03231':       'whatev'
}, true);

但不起作用。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

在您的上一个代码段中,您在user变量中拥有该用户的ID,但将对象放入对象项目位置。这不是有效的JavaScript。由于对象键是复合键,因此需要使用obj[''+id] = '';语法设置它:

var obj = { 
    'from_city':  ori,
    'to_city':    dest
};

obj['plan_0'+user] = 'whatev';
obj['aspp_0'+user] = 'whatev';

this.fill('form[action="../foo.cgi"]', obj, true);

您不需要显式用户ID的简单方法是使用^= attribute matchercasper.fillSelectors根据名称属性的开头选择表单字段:

this.fillSelectors('form[action="../foo.cgi"]', { 
    '*[name="from_city"]': ori,
    '*[name="to_city"]':   dest,
    '*[name^="plan_0"]':   'whatev'
    '*[name^="aspp_0"]':   'whatev'
}, true);