2016-02-29 4 views
5

पर समानांतर अनुरोध करें मैं समानांतर में एकाधिक कमांड चलाने के लिए सेलेनियम सर्वर ग्रिड का उपयोग करने का प्रयास कर रहा हूं।सेलेनियम वेबड्राइवर ग्रिड

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" एक वादा पैदा करता है। मेरा विचार यह है कि तीन अनुरोध अतुल्यकालिक रूप से किए जाते हैं और इस प्रकार लगभग एक साथ दिखाई देते हैं। लेकिन जैसा कि आप स्क्रीनशॉट में देख सकते हैं, उन्हें एक के बाद एक बनाया जाएगा। ग्रिड में निश्चित रूप से पर्याप्त सेलेनियम उदाहरण हैं तो ड्राइवर समानांतर में क्यों काम नहीं कर रहा है? मुझे ऐसा लगता है कि "नया वेबड्राइवर.बिल्डर()" किसी प्रकार का सिंगलटन बनाता है जो एसिंक काम नहीं करता है लेकिन पिछले अनुरोध को पूरा करने की प्रतीक्षा करता है !?

किसी भी मदद के लिए धन्यवाद!

उत्तर

2

जवाब multiple control flows हो सकता है:

WebDriverJS "समांतर" को परिभाषित करने का समर्थन करता है webdriver.promise.createFlow() का उपयोग कर प्रवाह। यह फ़ंक्शन एक कॉलबैक स्वीकार करता है जो नव निर्मित प्रवाह पारित किया जाएगा। इस प्रवाह के भीतर निर्धारित कार्य एक दूसरे के साथ सिंक्रनाइज़ किए जाएंगे, लेकिन किसी अन्य नियंत्रण प्रवाह के स्वतंत्र बने रहेंगे। Flow() बनाने के लिए प्रत्येक कॉल वादा देता है जो प्रवाह पूरा होने पर हल हो जाएगा।

अध्याय के अंत में (जो मैं काफी शब्दशः करेंगे) दिखाता है एकाधिक Google खोज शब्दों समवर्ती परीक्षण किया जा रहा पर उदाहरण:

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

अच्छा, धन्यवाद! यह अब काफी async दिखता है, उस सुविधा को ध्यान में नहीं देखा है। मुझे आश्चर्य है कि क्या यह अब हब में सेलेनियम इंस्टेंस पर समानांतर परीक्षण चलाता है या यदि लोड संतुलन अपेक्षित काम करता है। लेकिन मुझे पता चल जाएगा;) – Gibbonson

संबंधित मुद्दे