2016-04-06 4 views
3

Я пытаюсь запустить несколько экземпляров 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 в одном процессе или это единственное решение для создания пусковой установки для запуска нескольких процессов?

ответ

2

Да, вы можете использовать несколько экземпляров casper, но вы должны иметь в виду, что все они работают в одном и том же процессе PhantomJS, что сопоставимо с окном обозревателя одного рабочего стола. У вас может быть много вкладок, но вкладки будут иметь одни и те же файлы cookie/localStorage и, следовательно, один и тот же сеанс.

Поскольку вы пытаетесь протестировать логин, который предположительно реализован через файлы cookie, это не сработает. Первая «вкладка» открывает страницу входа в систему, пытается войти в систему, может преуспеть. Но вторая «табуляция» одновременно пытается сделать одно и то же. Сервер, вероятно, обнаруживает это, как будто пользователь сделал двойной щелчок и не работает ни с логином, ни с одним из них (просто догадываясь на этот момент).

Ключевым моментом является то, что если вам нужны разные сеансы, то вы не можете использовать несколько экземпляров casper в одном процессе. Очевидным решением было бы позволить тестовому запуску для каждой комбинации имени пользователя и пароля в нескольких экземплярах PhantomJS (возможно, пул).

+0

Интересно, почему я не могу получить правильные результаты при параллельном тестировании Casper против того же самого ранга. Иногда они запускают сервер, отвечают правильными данными, иногда нет. –

+0

@Canadian_Republican Нет, вероятно, нет. Но если сайт использует 'localStorage', то это, скорее всего, проблема. Единственное, что PhantomJS сохраняется на диске по умолчанию, это 'localStorage'. Таким образом, несколько экземпляров CasperJS, работающих в разных процессах PhantomJS, могут перезаписывать «localStorage» друг друга. Хотя я не могу быть уверен. –

Смежные вопросы