无法并行运行Selenium PhantomJS实例

fre*_*und 7 javascript selenium node.js phantomjs selenium-webdriver

我正在使用Selenium的node.js API来针对一系列网页运行PhantomJS实例.我用来执行页面上的操作的代码运行正常,但似乎只有一个Selenium/PhantomJS实例可以一次运行.从同一模块多次调用此函数,并逐步遍历网店中的页面,其中页面处理客户端(这就是我需要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();
    });
}
Run Code Online (Sandbox Code Playgroud)

小智 0

Selenium 的并行执行往往是使用Remote WebDrivers和 Selenium Grid2 Framework来完成的。

WeDoQA的这个教程似乎正是您想要的东西。乍一看,每个测试都在一个单独的类中,而中央测试基类指向 Grid2 的集线器,然后(在教程中)使用 Firefox 驱动程序并行执行测试。您可以轻松地重新调整它以使用 phantomjs,但您可能必须重新设计您的测试结构。