2016-02-29 16 views
5

Sto provando a utilizzare una griglia di server di selenio per eseguire più comandi in parallelo. Ecco il mio primo codice di prova:Effettuare richieste parallele a una griglia Selenium Webdriver

var webdriver = require('selenium-webdriver'); 

for(var u = 0; u < 3; u++) { 
    makeScreenshot('foo/test' + u + '.png'); 
} 

function makeScreenshot(path) { 

    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(path); 
      //var decodedImage = new Buffer(data, 'base64') 

      driver.quit(); 

     }); 
    }); 

} 

Questo è il risultato:

Get 
Get 
Get 
Screenshot 
foo/test0.png 
Screenshot 
foo/test1.png 
Screenshot 
foo/test2.png 

screenshot of requests

Il appare "Get" immediatamente in sequenza, "driver.get" crea una promessa. La mia idea qui è che le tre richieste sono fatte in modo asincrono e quindi appaiono quasi simultaneamente. Ma come puoi vedere nello screenshot saranno realizzati uno dopo l'altro. La griglia ha sicuramente abbastanza istanze di selenio, quindi perché il driver non funziona in parallelo? Mi sembra che "nuovo webdriver.Builder()" crei una sorta di singleton che non funziona asincrono ma aspetta che la richiesta precedente finisca !?

Grazie per qualsiasi aiuto!

risposta

2

La risposta può essere multiple control flows:

WebDriverJS supporta la definizione di "parallelo" flussi usando webdriver.promise.createFlow(). Questa funzione accetta una richiamata che sarà passata a il flusso appena creato. Le attività pianificate all'interno di questo flusso verranno sincronizzate tra loro, ma rimarranno indipendenti da di qualsiasi altro flusso di controllo. Ogni chiamata a createFlow() restituisce una promessa che verrà risolta al termine del flusso.

L'esempio alla fine del capitolo (che sarò abbastanza testualmente) mostra più termini di ricerca Google in fase di test in concomitanza:

var terms = [ 
    'javascript', 
    'selenium', 
    'webdriver' 
]; 

var flows = terms.map(function(term) { 
return webdriver.promise.createFlow(function() { 
    var driver = new webdriver.Builder().build(); 

    driver.get('http://www.google.com'); 
    driver.findElement(webdriver.By.name('q')).sendKeys(term); 
    driver.findElement(webdriver.By.name('btnG')).click(); 
    driver.getTitle().then(function(title) { 
    if (title !== (term + ' - Google Search')) { 
     throw Error('Unexpected title: ' + title); 
    } 
    }); 
}); 
}); 

webdriver.promise.fullyResolved(flows).then(function() { 
console.log('All tests passed!'); 
}); 

Dovrebbe essere abbastanza facile aggiungere la costruzione driver personalizzato e ricerche in quell'esempio. Forse il seguente:

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(); 
     }); 
    }); 
}); 
}); 
+0

Bello, grazie! Ora sembra abbastanza asincrono, non ho notato quella caratteristica. Mi chiedo se ora esegue test paralleli solo sull'istanza di selenio nell'hub o se il bilanciamento del carico funziona come previsto. Ma lo scoprirò;) – Gibbonson