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

标签 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);

但不工作。有人可以帮助我吗?

最佳答案

在最后的代码片段中,您可以在 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 matcher 根据名称属性的开头简单地选择表单字段。和 casper.fillSelectors :

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

关于javascript - 在 CasperJS 中用动态名称填充字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27423107/

相关文章:

javascript - Chrome 开发工具无法展开 Iframe 内容

c++ - 无法在 gdb 中打印全局对象

javascript - 在知道对象值的情况下确定数组中 JS 对象的索引

javascript - 选择选项时 dataList 自动填充其他字段 - AngularJs

javascript - 以编程方式更改初始化选项

javascript - 如何在函数内部的全局上下文中定义javascript中的函数?

c - 如何记录函数的全局依赖性?

javascript - CasperJS 测试覆盖率

CasperJS:打开一个新窗口

javascript - 为什么 this.evaluate 不能正确返回 DOM 节点?