无法并行运行Selenium PhantomJS实例

我使用Selenium的node.js API来针对一系列网页运行PhantomJS实例。 我用来执行页面上的操作的代码工作正常,但似乎只有一个Selenium / PhantomJS实例可以运行在一个时间。 这个函数是从同一个模块中多次调用的,并且在分页处理客户端的networking商店中进行分页(这就是为什么我需要Selenium / PhantomJS环境 – 从每个页面提取数据)。

代码本身再次正常工作,但不能并行执行。 什么可能导致这个?

module.exports = function (crawler, page, parsePage, done) { "use strict"; var _ = require("lodash"), format = require("util").format, path = require("path"), webdriver = require("selenium-webdriver"), By = webdriver.By, until = webdriver.until; var phantomPath = path.resolve(__dirname, "../node_modules/.bin/phantomjs"), isWin = process.platform === "win32"; var driver = new webdriver.Builder() .withCapabilities({ "phantomjs.binary.path": isWin ? phantomPath + ".cmd" : phantomPath }) .forBrowser("phantomjs") .build(); var windowHandle = new webdriver.WebDriver.Window(driver); windowHandle.setSize(1100, 1000); var getAllPagesContent = function (driver) { var pagesContent = [], pageNo = 1; var getNextPage = function () { var nextPageLink; return driver.findElements(By.css(".pagination li")).then(function (elements) { return elements[elements.length - 1]; }).then(function (element) { nextPageLink = element; return element.getAttribute("class"); }).then(function (className) { return _.includes(className, "active"); }).then(function (isLastPage) { return (!isLastPage) ? driver.getPageSource() : false; }).then(function (content) { if (content) pagesContent.push(content); content && console.log("Got page %d", pageNo++); return nextPageLink.findElement(By.css("a")).then(function (element) { return element.click(); }).then(function () { return driver.wait(until.stalenessOf(nextPageLink), 10 * 1000); }).then(function () { return content ? getNextPage() : pagesContent; }); }); }; return getNextPage(); }; var processTimeout = setTimeout(function () { console.log("PhantomJS for page %s took too long to execute", page.url); driver.quit().then(done); }, 60 * 1000); driver.get(page.url).then(function () { var pageOverlay = driver.findElement(By.css("#overlay-the-new")); return pageOverlay.isDisplayed().then(function (visible) { if (visible) { pageOverlay.click(); return driver.wait(until.elementIsNotVisible(pageOverlay), 10000); } }).then(function () { return getAllPagesContent(driver); }); }).then(function (contents) { clearTimeout(processTimeout); console.log("Got %d pages for %s", contents.length, page.url); _.forEach(contents, function (pageContent) { parsePage(page.url, pageContent); }); return driver.quit(); }).then(function () { done(); }); } 

尽pipePhantomJS现在已被弃用,但仍然可以通过使用Selenoid在并行隔离的Docker容器中运行它。 有一个准备好的图像与最新版本在这里: https : //hub.docker.com/r/selenoid/phantomjs/tags/

使用Selenium并行执行通常使用远程WebDrivers和Selenium Grid2框架来完成。

WeDoQA的这个教程似乎就是你想要的东西。 简而言之,它将每个testing都放在一个单独的类中,而一个中央testing基类指向Grid2的集线器,然后(在本教程中)使用Firefox驱动程序并行执行testing。 你可以很容易地重新使用phantomjs,但是你可能需要重做你的testing结构。

看来你只使用一个驱动程序。 我会初始化第二个驱动程序,然后使用线程并行运行。 我认为这可以完成工作。

使用Thread可以并行运行,也可以使用任何能够并行运行testing的testing框架。