Javascript 具有阵列重新加载页面的多个用户凭据

Javascript 具有阵列重新加载页面的多个用户凭据,javascript,casperjs,Javascript,Casperjs,我试图使用数组测试4个用户名和密码。通过在wordpress中获取“你好,(用户名)”来检查第一个用户名和密码是否成功。我的问题: 运行循环后,无法重新加载可输入用户名和密码的页面;如何重新加载页面以继续测试下一个用户名/密码 CasperError:无法从#log:元素获取信息,未找到 找不到该元素,因为它正试图在现在的“登录”页面中找到它 这是有功能的。你可以使用,也可以实现 此外,您应该不要使用setInterval或setTimeout来执行一些调度,因为CasperJS本身是异步的,但

我试图使用数组测试4个用户名和密码。通过在wordpress中获取“你好,(用户名)”来检查第一个用户名和密码是否成功。我的问题:

运行循环后,无法重新加载可输入用户名和密码的页面;如何重新加载页面以继续测试下一个用户名/密码

CasperError:无法从#log:元素获取信息,未找到

找不到该元素,因为它正试图在现在的“登录”页面中找到它


这是有功能的。你可以使用,也可以实现

此外,您应该不要使用
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用户代理。请参阅,这可能会导致加载页面出错。我试试看。