我正在尝试创建一个Phantom Webdrivers池[使用webdriverjs],如
var driver = new Webdriver.Builder().withCapabilities(Webdriver.Capabilities.phantomjs()).build();
一旦池被填充[我看到产生了n个虚拟进程],我尝试使用不同URL的driver.get
[使用池中的不同驱动程序],期望它们并行工作[作为driver.get是异步的。
但我总是看到他们按顺序完成。 我们不能通过不同的Web驱动程序实例并行加载不同的URL吗? 如果以这种方式不可能,我还能解决这个问题吗?
非常基本Impl我的问题将如下所示
var Webdriver = require('selenium-webdriver'),
function getInstance() {
return new Webdriver.Builder().withCapabilities(Webdriver.Capabilities.phantomjs()).build();
}
var pool = [];
for (var i = 0; i < 3; i++) {
pool.push(getInstance());
}
pool[0].get("http://mashable.com/2014/01/14/outdated-web-features/").then(function () {
console.log(0);
});
pool[1].get("http://google.com").then(function () {
console.log(1);
});
pool[2].get("http://techcrunch.com").then(function () {
console.log(2);
});
PS:已发布here
更新: 我尝试使用以下设置的selenium网格;正如提到它可以并行运行测试
集线器:
java -jar selenium/selenium-server-standale-2.39.0.jar -hosost 127.0.0.1 -port 4444 -role hub -nodeTimeout 600
幻影:
phantomjs --webdriver=7777 --webdriver-selium-grid-hub=http://127.0.0.1:4444 --debug=true
phantomjs --webdriver=7877 --webdriver-selium-grid-hub=http://127.0.0.1:4444 --debug=true
phantomjs --webdriver=6777 --webdriver-selium-grid-hub=http://127.0.0.1:4444 --debug=true
我仍然看到get
命令排队并顺序执行而不是parall。 [但是可以在3个实例中正确分配]
我还在遗漏一些东西吗?
为什么在文档中通过在多台计算机上分发测试(并行执行)来提及“扩展?”
根据集线器并行的是什么?我变得无能为力了
答案 0 :(得分:1)
我想我得到了这个问题..
基本上https://code.google.com/p/selenium/source/browse/javascript/node/selenium-webdriver/executors.js#39是同步和阻塞操作[至少是get]。 每当发出 get 命令时,节点的主线程就会卡在那里。没有进一步的代码执行。
答案 1 :(得分:1)
有点晚了,但对我来说它适用于webdriver.promise.createFlow。 您只需将代码包装在webdriver.promise.createFlow(){...})中;它对我有用!以下是Make parallel requests to a Selenium Webdriver grid的示例。感谢那里的回答者......
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();
});
});
});
});
答案 2 :(得分:0)
我遇到了同样的问题,我终于使用child_process解决了这个问题。
我的应用程序设置方式是我有许多任务执行不同的操作,并且需要同时运行(每个都使用不同的驱动程序实例),显然它无法正常工作。 我现在在 child_process (将运行新的V8进程)中启动这些任务,它会并行运行所有内容。