我正在尝试使用 CasperJS 登录 Capital One 360 银行帐户。它加载用户名屏幕,正确输入用户名,加载密码屏幕,但随后超时(大概没有错误)并在输入密码后停止。
有人知道我做错了什么吗?
var casper = require('casper').create({
verbose: true,
logLevel: "debug"
});
var capone360 = "https://secure.capitalone360.com/myaccount/banking/login.vm";
casper.start(capone360);
casper.then(function(){
casper.waitForSelector("#ACNID", function() {
this.echo(this.getTitle());
this.sendKeys('#ACNID', username);
}, true);
});
casper.then(function(){
this.click("#btn_continue");
});
casper.then(function(){
this.waitForSelector("#currentPassword_TLNPI", function() {
this.echo(this.getTitle());
this.sendKeys('#currentPassword_TLNPI', password);
}, true);
});
casper.then(function(){
this.clickLabel("Continue", "a");
});
casper.then(function(){
this.waitForSelector("#deposittable", function() {
this.echo(this.getTitle());
}, true);
});
casper.run();
PhantomJS 版本 2.0.0
更新 切换到 PhantomJS 1.9.8。根据 @Artjom B. 的建议。现在有错误说: '无法在不存在的选择器上调度 mousedown 事件:xpath 选择器://a[text()="Continue"]'。
它正在尝试点击:
<a class="ada-new-win" href="javascript:void(0);" role="button" onclick="submitForm('continue'); return false;">Continue</a>
我认为它应该在那里,因为它正在等待密码输入框加载,但我是否忘记了其他东西?
最佳答案
PhantomJS 2.0.0 有一个错误,即使专门监听各种错误事件,错误也不会打印到控制台。这就是为什么您看不到明显的错误,如下所示:
TypeError: true is not a function
该错误的原因是您提供 true
作为 waitForSelector()
的第三个参数,但函数签名是
waitForSelector(String selector[, Function then, Function onTimeout, Number timeout])
脚本中的某些步骤似乎中断了,因为找不到选择器。传递的函数 onTimeout
将被执行,但是true
不是一个函数。只需删除第三个参数即可查看错误所在。如果仍然没有显示任何内容,请尝试使用 PhantomJS 1.9.8。
您需要等待“继续”按钮出现,使用 waitForSelector(x(selector))
和/或您需要使用更强大的选择器:
var x = require("casper").selectXPath;
...
var continueButtonSelector = x("//a[contains(text(), 'Continue')]");
casper.waitForSelector(continueButtonSelector);
casper.thenClick(continueButtonSelector);
这有时是必要的,因为元素可能是用这样的空格定义的
<a> Continue </a>
^^^ ^^^
这意味着 text()="Continue"
无法匹配。浏览器渲染器会忽略这个空白,但它仍然在 DOM 中。
关于javascript - 登录银行帐户时 CasperJS 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32629188/