Selenium Webdriver JS Scrapping并行[nodejs]

时间:2014-02-21 12:42:04

标签: node.js selenium selenium-webdriver phantomjs

我正在尝试创建一个Phantom Webdrivers池[使用webdriverjs],如

var driver = new Webdriver.Builder().withCapabilities(Webdriver.Capabilities.phantomjs()).build();

一旦池被填充[我看到产生了n个虚拟进程],我尝试使用不同URL的driver.get [使用池中的不同驱动程序],期望它们并行工作[作为driver.get是异步的。

但我总是看到他们按顺序完成。 我们不能通过不同的Web驱动程序实例并行加载不同的URL吗? 如果以这种方式不可能,我还能解决这个问题吗?

非常基本Impl我的问题将如下所示

var Webdriver = require('selenium-webdriver'),

function getInstance() {
   return new Webdriver.Builder().withCapabilities(Webdriver.Capabilities.phantomjs()).build();
}

var pool = [];
for (var i = 0; i < 3; i++) {
  pool.push(getInstance());
}
pool[0].get("http://mashable.com/2014/01/14/outdated-web-features/").then(function () { 
  console.log(0);
});

pool[1].get("http://google.com").then(function () { 
  console.log(1);
});

pool[2].get("http://techcrunch.com").then(function () { 
  console.log(2);
});

PS:已发布here

更新: 我尝试使用以下设置的selenium网格;正如提到它可以并行运行测试

集线器:

java -jar selenium/selenium-server-standale-2.39.0.jar -hosost 127.0.0.1 -port 4444 -role hub -nodeTimeout 600

幻影:

phantomjs --webdriver=7777 --webdriver-selium-grid-hub=http://127.0.0.1:4444 --debug=true
phantomjs --webdriver=7877 --webdriver-selium-grid-hub=http://127.0.0.1:4444 --debug=true
phantomjs --webdriver=6777 --webdriver-selium-grid-hub=http://127.0.0.1:4444 --debug=true

我仍然看到get命令排队并顺序执行而不是parall。 [但是可以在3个实例中正确分配]

我还在遗漏一些东西吗?

为什么在文档中通过在多台计算机上分发测试(并行执行)来提及“扩展?”

根据集线器并行的是什么?我变得无能为力了

3 个答案:

答案 0 :(得分:1)

我想我得到了这个问题..

基本上https://code.google.com/p/selenium/source/browse/javascript/node/selenium-webdriver/executors.js#39是同步和阻塞操作[至少是get]。 每当发出 get 命令时,节点的主线程就会卡在那里。没有进一步的代码执行。

答案 1 :(得分:1)

有点晚了,但对我来说它适用于webdriver.promise.createFlow。 您只需将代码包装在webdriver.promise.createFlow(){...})中;它对我有用!以下是Make parallel requests to a Selenium Webdriver grid的示例。感谢那里的回答者......

var flows = [0,1,2,3].map(function(index) {
 return webdriver.promise.createFlow(function() {
   var driver = new webdriver.Builder().forBrowser('firefox').usingServer('http://someurl:44111/wd/hub/').build();

   console.log('Get');
   driver.get('http://www.somepage.com').then(function() {

        console.log('Screenshot');
        driver.takeScreenshot().then(function(data){

            console.log('foo/test' + index + '.png');
            //var decodedImage = new Buffer(data, 'base64')

            driver.quit();
        });
    });
 });
});

答案 2 :(得分:0)

我遇到了同样的问题,我终于使用child_process解决了这个问题。

我的应用程序设置方式是我有许多任务执行不同的操作,并且需要同时运行(每个都使用不同的驱动程序实例),显然它无法正常工作。 我现在在 child_process (将运行新的V8进程)中启动这些任务,它会并行运行所有内容。