2016-02-29 7 views
5

Ich versuche ein Selen Server Grid zu verwenden, um mehrere Befehle parallel auszuführen. Hier mein erster Testcode ist:Erstelle parallele Anfragen an ein Selenium Webdriver Grid

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(); 

     }); 
    }); 

} 

Das ist das Ergebnis:

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

screenshot of requests

Das "Get" erscheint sofort in der Folge "driver.get" schafft ein Versprechen. Meine Idee hier ist, dass die drei Anfragen asynchron gestellt werden und somit fast gleichzeitig erscheinen. Aber wie Sie auf dem Screenshot sehen können, werden sie nacheinander gemacht. Das Grid hat definitiv genügend Selen Instanzen, warum arbeitet der Treiber nicht parallel? Es scheint mir, dass "new webdriver.Builder()" eine Art Singleton erstellt, die nicht async funktioniert, sondern auf die vorherige Anfrage wartet, um zu beenden?

Danke für jede Hilfe!

Antwort

2

Die Antwort kann multiple control flows sein:

WebDriverJS unterstützt die Definition "parallel" Ströme mit webdriver.promise.createFlow(). Diese Funktion akzeptiert einen Callback, der den neu erstellten Fluss übergeben wird. Aufgaben, die innerhalb dieses Ablaufs eingeplant sind, werden miteinander synchronisiert, bleiben jedoch unabhängig von anderen Steuerflüssen . Jeder Aufruf von createFlow() gibt eine Zusage zurück, die aufgelöst wird, wenn der Ablauf abgeschlossen ist.

Das Beispiel am Ende des Kapitels (was ich ganz wörtlich werden) zeigt gleichzeitig mehrere Google-Suchbegriffe getestet werden:

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!'); 
}); 

Es ist leicht genug sein sollte, Ihren kundenspezifischen Treiber Build hinzuzufügen und Nachschlagen in diesem Beispiel. Vielleicht folgendes:

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

Schön, danke! Es sieht jetzt ziemlich async aus, habe dieses Feature nicht bemerkt. Ich frage mich, ob es nun parallele Tests an Selen-Instanzen am Hub durchführt oder ob der Lastausgleich wie erwartet funktioniert. Aber ich werde es herausfinden;) – Gibbonson