Javascript 具有阵列重新加载页面的多个用户凭据
我试图使用数组测试4个用户名和密码。通过在wordpress中获取“你好,(用户名)”来检查第一个用户名和密码是否成功。我的问题: 运行循环后,无法重新加载可输入用户名和密码的页面;如何重新加载页面以继续测试下一个用户名/密码 CasperError:无法从#log:元素获取信息,未找到 找不到该元素,因为它正试图在现在的“登录”页面中找到它Javascript 具有阵列重新加载页面的多个用户凭据,javascript,casperjs,Javascript,Casperjs,我试图使用数组测试4个用户名和密码。通过在wordpress中获取“你好,(用户名)”来检查第一个用户名和密码是否成功。我的问题: 运行循环后,无法重新加载可输入用户名和密码的页面;如何重新加载页面以继续测试下一个用户名/密码 CasperError:无法从#log:元素获取信息,未找到 找不到该元素,因为它正试图在现在的“登录”页面中找到它 这是有功能的。你可以使用,也可以实现 此外,您应该不要使用setInterval或setTimeout来执行一些调度,因为CasperJS本身是异步的,但
这是有功能的。你可以使用,也可以实现 此外,您应该不要使用
setInterval
或setTimeout
来执行一些调度,因为CasperJS本身是异步的,但这些函数只有在以后要执行同步函数时才有用。CasperJS通过使用setInterval
或setTimeout
来安排中断的步骤来工作。有关此项中断的另一种情况,请参阅
更改登录
以直接使用用户名
和密码
,并相应更改实现(您不需要计数器):
登录页面后,需要先注销,然后才能使用下一个凭据。CasperJS使用cookie,当使用然后打开时,cookie不会被清除
因此,脚本将如下所示:
casper.start(); // empty page
userNames.forEach(function(username, index){
casper.thenOpen(url); // open the start page
login(username, passWords[index]); // schedule the steps
// you can also move the following steps inside the login function
casper.then(function(){
// do something
});
casper.then(function(){
// click logout button
});
});
casper.run(); // begin the execution
casper.run(function(){
this.echo("success: " + glob.success.length + ", fail: " + glob.fail.length);
this.echo(JSON.stringify(glob));
});
下面是完整代码的示例
如果要跟踪成功登录和不成功登录,则需要一个全局变量:
var glob = {success: [], fail: []}; // before start for readability
casper.wait(5000, function () {
// use some indicator that the login worked, here the logout button
if (this.exists(logoutButtonSelector)) {
glob.success.push(username);
} else {
glob.fail.push(username);
}
this.echo(this.getTitle());
this.echo(this.fetchText('#wp-admin-bar-my-account > a'));
casper.capture('pic.png');
});
在login
中,您可以写入变量:
var glob = {success: [], fail: []}; // before start for readability
casper.wait(5000, function () {
// use some indicator that the login worked, here the logout button
if (this.exists(logoutButtonSelector)) {
glob.success.push(username);
} else {
glob.fail.push(username);
}
this.echo(this.getTitle());
this.echo(this.fetchText('#wp-admin-bar-my-account > a'));
casper.capture('pic.png');
});
然后可以按如下方式打印:
casper.start(); // empty page
userNames.forEach(function(username, index){
casper.thenOpen(url); // open the start page
login(username, passWords[index]); // schedule the steps
// you can also move the following steps inside the login function
casper.then(function(){
// do something
});
casper.then(function(){
// click logout button
});
});
casper.run(); // begin the execution
casper.run(function(){
this.echo("success: " + glob.success.length + ", fail: " + glob.fail.length);
this.echo(JSON.stringify(glob));
});
你好@ArtjomB.,谢谢你的回复。当您提到//计划步骤时,我就是在这里编写this.sendKeys。。。?请你把代码扩展一下好吗?谢谢。不,casper的step函数都是wait*
和then*
函数,另外还有repeat
和函数。其他一切都是同步函数。当您编写this.sendKeys(…)时;这个。点击(…)代码>当步骤开始执行时,所有这些都在步骤内部同步执行。所以我不可能一次传递一个用户名/密码组合?我想传递一个用户名及其相应的密码,然后单击登录按钮,这将带我进入登录页面,在那里我可以获取一段独特的文本。然后我想用3个额外的用户名/密码组合重复同样的功能3次。当然你可以这样做。您可以嵌套多个步骤函数,只要它们都在同步函数之后(如在回调到然后
中,等待
是一个步骤,但单击
是同步的)。你现在试过了吗?我的意思是你只需要调整login
就可以使用传递的参数而不是计数器。再次感谢。我成功地使用第一个用户名和密码组合登录,并获取了一条文本:“Howdy,username1”。但随后脚本停止了。我希望它能继续运行,再运行3次,直到到达username4。抱歉,我确信这对我来说是个问题,因为我缺乏JS技能。你可能想删除IE用户代理。请参阅,这可能会导致加载页面出错。我试试看。