2016-02-29 13 views
5

Próbuję użyć siatki serwerów selenowych do jednoczesnego uruchamiania wielu poleceń. Oto mój pierwszy kod testu:Wykonywanie równoległych żądań do siatki 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(); 

     }); 
    }); 

} 

To rezultat: pojawia się natychmiast w sekwencji

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

screenshot of requests

"Get", "driver.get" tworzy obietnicę. Mój pomysł polega na tym, że trzy żądania są wykonywane asynchronicznie, a zatem pojawiają się niemal jednocześnie. Ale jak widać na zrzucie ekranu, zostaną one wykonane jeden po drugim. Siatka ma zdecydowanie wystarczającą liczbę instancji selenu, więc dlaczego sterownik nie działa równolegle? Wydaje mi się, że "nowy webdriver.Builder()" tworzy jakiś singleton, który nie działa asynchronicznie, ale czeka na zakończenie poprzedniego żądania !?

Dzięki za pomoc!

Odpowiedz

2

Odpowiedź może być multiple control flows:

WebDriverJS obsługuje definiująca "równolegle" płynie pomocą webdriver.promise.createFlow(). Ta funkcja akceptuje wywołanie zwrotne, które zostanie przekazane nowoutworzonemu przepływowi. Zadania zaplanowane w tym strumieniu zostaną zsynchronizowane ze sobą, ale pozostaną niezależne od innych przepływów sterowania. Każde wywołanie createFlow() zwraca obietnicę, która zostanie rozstrzygnięta po zakończeniu przepływu.

Przykład na końcu rozdziału (które będę całkiem dosłowny) pokazuje, że wiele haseł wyszukiwanych w Google testowanej równocześnie:

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

Należy dość łatwo dodać swój build niestandardowego sterownika i szuka w tym przykładzie. Być może:

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

Dobrze, dziękuję! Teraz wygląda całkiem asynchronicznie, nie zauważyłem tej funkcji. Zastanawiam się, czy teraz uruchamia testy równoległe tylko na instancji selenu w hubie lub czy równoważenie obciążenia działa zgodnie z oczekiwaniami. Ale dowiem się;) – Gibbonson

Powiązane problemy