CasperJS可以在同一个进程中运行多个实例吗?

时间:2016-04-06 04:23:49

标签: javascript multithreading phantomjs casperjs

我试图在同一个进程上运行CasperJS的多个实例,我的测试代码看起来像这样:

['user1,pass1', 'user2,pass2'].forEach(function( account ) {
    var casperInstance = require('casper').create({
          verbose: true,
          logLevel: "debug",
            webSecurityEnabled: false,
          pageSettings: {
               loadImages:  true,
               loadPlugins: true,
               userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4'
          }
    });

  runit(casperInstance, account);
});

function runit(casperi, account) {

    casperi.options.viewportSize = {width: 1920, height: 1080};

    var account = account.split(',');

    casperi.start( 'https://www.example.com/login/', function ( ) {
        var x = require('casper').selectXPath;

        this.fill('form.loginForm', {
            'username': account[0], 
            'password': account[1]
        }, false);

        this.click(x('//*[text()="Log in"]'));

    }).waitForUrl(/https:\/\/www.example.com\/$/, function then() { // have to use this because the form is submitted with ajax, is there a better way?
        //this.echo(this.getHTML());
    this.echo('Logged in');
    }, function OnTimeout() {
    this.echo('Login Failed');
    }, 20000);

    casperi.run();
}

在阵列上只有一个帐户它工作正常,但有两个或更多,它总是超时,我不认为我的代码运行多个casper实例,因为如果我将所有登录代码替换为只需打印html(或其他任何内容),只打印一次。

有没有办法在同一个进程上运行CasperJS的多个实例,或者是创建启动程序以启动多个进程的唯一解决方案?

1 个答案:

答案 0 :(得分:2)

是的,您可以使用多个casper实例,但必须记住它们都在相同的PhantomJS进程中运行,这与单个桌面浏览器窗口相当。您可以有多个选项卡,但选项卡将共享相同的cookie / localStorage,因此会共享相同的会话。

因为,你试图测试登录,这可能是通过cookie实现的,这是行不通的。第一个“选项卡”打开登录页面,尝试登录,可能会成功。但第二个“标签”同时尝试同样的事情。服务器可能会检测到这一点,就好像用户进行了双击,并且没有继续登录或只是其中一个(此时只是猜测)。

关键是,如果您需要不同的会话,则不能在单个进程中使用多个casper实例。显而易见的解决方案是让测试针对多个PhantomJS实例中的每个用户名和密码组合运行(可能是某种池)。