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,但您可能必须重新设计您的测试结构。
| 归档时间: |
|
| 查看次数: |
880 次 |
| 最近记录: |