2016-02-29 42 views
5

我試圖使用selenium服務器網格並行運行多個命令。 這是我的第一個測試代碼:向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(); 

     }); 
    }); 

} 

這就是結果:

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

screenshot of requests

「獲取」,立即出現在序列中, 「driver.get」 創建一個承諾。我的想法是,這三個請求是異步的,因此幾乎同時出現。但正如你在屏幕截圖中看到的那樣,它們將會一個接一個地完成。 網格絕對有足夠的硒實例,爲什麼驅動程序並行工作? 在我看來,「新的webdriver.Builder()」創建一種不工作異步,但等待先前的請求完成的單身!?

感謝您的幫助!

回答

2

答案可能是multiple control flows

WebDriverJS支持定義 「平行」 使用 webdriver.promise.createFlow()流。這個函數接受一個回調,其中 將被傳遞給新創建的流。計劃在此 流程中的任務將彼此同步,但將保持任何其他控制流程的獨立 。每次調用createFlow()都會返回一個 諾言,該諾言將在流程完成時解決。

在本章的最後(我將相當逐字)顯示多個谷歌搜索詞被同時測試的例子:

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

它應該是很容易的添加自定義驅動程序構建和查找該例子。也許如下:

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

不錯,謝謝!它現在看起來非常異步,沒有注意到這個功能。我想知道它現在是否在集線器上的selenium實例上運行並行測試,或者負載平衡是否按預期工作。但我會發現;) – Gibbonson