我正在使用Casperjs 1.1.0-beta3并尝试通过“id”填充表单。选择。我已成功使用"输入[name =' userID']"但使用' id'因为选择器总是失败,错误类似于下面的错误。
CasperError:填写表单时遇到的错误:没有匹配css选择器的字段"#header-my-account-userid"通知;没有字段匹配的css选择器"#header-my-account-password"形式
方法1工作正常。方法2,3,4都失败了。我只是一次尝试一种方法并评论其他方法。我还为这个问题删除了额外的表格标签。
我发现这个问题stackoverflow question仍然没有用。{/ p>
有什么想法吗?
HTML
<input id="header-my-account-userid" name="userID" class="m-my-account-userid" maxlength="80" autocomplete="off" placeholder="Email or Rewards #" type="text">
<input id="header-my-account-password" name="password" class="m-my-account-password" maxlength="20" autocomplete="off" placeholder="Password" type="password">
<button type="submit" name="submit" id="header-my-account-sign-in" class="analytics-click m-button-default" title="Sign In">Sign In</button>
Casperjs Script
casper.then(function() {
casper.waitForSelector('form[name=directLoginForm]', function() {
// Method 1 Works
this.fillSelectors("form[name=directLoginForm]", {
'input[name=userID]' : username,
'input[name=password]' : password
}, true);
// Method 2 Does not work
this.fillSelectors("form[name=directLoginForm]", {
'input[id="header-my-account-userid"]' : username,
'input[id="header-my-account-password"]' : password
}, true);
// Method 3 Does not work
this.fillSelectors("form[name=directLoginForm]", {
'header-my-account-userid' : username,
'header-my-account-password' : password
}, true);
// Method 4 Does not work
this.fillSelectors("form[name=directLoginForm]", {
'#header-my-account-userid' : username,
'#header-my-account-password' : password
}, true);
});
});
答案 0 :(得分:0)
我试过,它们都有效(除了3因为你的选择器无效)。 我将bool设置为false以查看更改,但填写表单时不应遇到错误:没有匹配css选择器的字段&#34;#header-my-account-userid&#39;。
这不是一个casper错误,因此,它与您的案例有关。由于不明原因,它无法识别你的身份。
this.sendKeys('input[id="header-my-account-userid"]', username);
sendKeys也有效。
答案 1 :(得分:0)
最小的例子表明只有方法3不起作用。我怀疑你检查工作&#39;通过检查下一页是否加载来形成。可能是casper没有找到提交按钮的情况。尝试明确单击按钮。
此外,PhantomJS有时会出现非引用属性选择器的问题。你应该改变
"form[name=directLoginForm]"
到
"form[name='directLoginForm']"
答案 2 :(得分:0)
等待加载表单以使用selectors填充表单。使用waitForSelector(),waitFor(),wait()等而不是waitForResource()
casper.start('your_url_here',function(){
this.echo(this.getTitle());
});
casper.waitForResource("your_url_here",function() {
this.fillSelectors('#loginform', {
'input[name="Email"]' : 'your_email',
'input[name="Passwd"]': 'your_password'
}, true);
});
答案 3 :(得分:0)
我发现当casperJS对于浏览器来说太快而且casper.wait()
将解决问题时会发生这种情况。
这是一个例子:
// Make a test order
casper.then(function() {
casper.waitForSelector('#onestepcheckout-form', function() {
this.fillSelectors('#onestepcheckout-form', {
'input[id="billing:telephone"]': '12344534',
'input[id="billing:postcode"]': '432323',
'input[id="billing:city"]': 'London',
'input[id="billing:street1"]': 'Lambada is a good music'
}, false);
})
casper.wait(5000, function() {
this.fillSelectors('#onestepcheckout-form', {
'#sagepaydirectpro_cc_owner': 'Fizipit o Moyazoci',
'input[id="agreement-1"]': true
}, true);
})
this.test.pass('form populated');
});