首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有Node js的对象返回列表

带有Node js的对象返回列表
EN

Stack Overflow用户
提问于 2017-05-25 12:20:43
回答 2查看 8.3K关注 0票数 0

我最近开始了Node应用程序的开发,它在控制器中使用Selenium从网页中获取项目列表,并希望将获取的条目列表作为JSON响应返回。

代码语言:javascript
运行
复制
exports.read_all_products = function (req, res) {
    var driver = new webdriver.Builder().forBrowser('phantomjs').build();
    driver.get('https://www.test.com/products?PC=' +req.params.category);    
    driver.wait(until.elementLocated(By.className('product-slide-all')), 20000, 'Could not locate the element within the time specified');

    driver.findElements(By.className("product-slide-all")).then(function (elements) {
        var arr = [];
        elements.forEach(function (element) {
        element.getAttribute("innerHTML").then(function (html) {
            const dom = new JSDOM(html);
            var obj = new Object();
            obj.product_name = dom.window.document.querySelector(".product-name").textContent;
            obj.product_code = dom.window.document.querySelector(".product-code").textContent;
            obj.price = dom.window.document.querySelector(".product-price").textContent;
            arr.push(obj);
        });
    });
    res.json(arr);
    });
}

问题是,即使条目被添加到数组中,我也总是得到一个空的JSON响应。我想知道处理这种情况的正确方法。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-26 06:47:57

最后,在webdriver.promise.map.的帮助下,我能够让它工作起来。

移动web驱动程序HTML提取到单独的功能。

代码语言:javascript
运行
复制
var findItems = function (category) {
var driver = new webdriver.Builder().forBrowser('phantomjs').build();
var map = webdriver.promise.map;
driver.get('https://www.test.com?PC=' + category);
driver.wait(until.elementLocated(By.className('product-slide-all')), 30000, 'Could not locate the element within the time specified');
    var elems = driver.findElements(By.className("product-slide-all"));
        return map(elems, elem => elem.getAttribute("innerHTML")).then(titles => {
        return titles;
    });
}

然后从响应处理功能调用它,

代码语言:javascript
运行
复制
exports.read_all_products = function (req, res) {
findItems(req.params.category).then(function (html) {
    var value;
    var arr = [];
    Object.keys(html).forEach(function (key) {
        value = html[key];
        const dom = new JSDOM(value);
        var obj = new Object();
        obj.product_name = dom.window.document.querySelector(".product-name").textContent;
        obj.product_code = dom.window.document.querySelector(".product-code").textContent;
        obj.price = dom.window.document.querySelector(".product-price").textContent;
        arr.push(obj);
    });
    res.json(arr);
})
};

这在this stack overflow answers中有描述。

票数 0
EN

Stack Overflow用户

发布于 2017-05-25 15:07:11

看起来问题在于Selenium正在运行一个异步进程,因此响应会立即返回,因为没有任何东西阻止它。

findElements返回一个您需要返回响应的承诺。

看看How do I return the response from an asynchronous call?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44180456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档