Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回包含节点js的对象列表_Javascript_Node.js_Selenium - Fatal编程技术网

Javascript 返回包含节点js的对象列表

Javascript 返回包含节点js的对象列表,javascript,node.js,selenium,Javascript,Node.js,Selenium,我最近开始开发一个Node js应用程序,它在控制器中使用Selenium从网页获取项目列表,我想将获取的项目列表作为JSON响应返回 exports.read_all_products = function (req, res) { var driver = new webdriver.Builder().forBrowser('phantomjs').build(); driver.get('https://www.test.com/products?PC=' +req.pa

我最近开始开发一个Node js应用程序,它在控制器中使用Selenium从网页获取项目列表,我想将获取的项目列表作为JSON响应返回

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响应,即使项目被添加到数组中。我想知道处理这种情况的正确方法


谢谢。

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

findElements
返回您需要从中返回响应的承诺


看一看

最后,在webdriver.promise.map的帮助下,我终于可以让它工作了

将web驱动程序HTML提取移动到单独的函数

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;
    });
}
然后从响应处理函数调用它,如bellow

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);
})
};

这在中有描述

你能试着移动你的
res.json(arr)吗向上一级?(在
}之前))?不,然后我收到一个错误,说“发送后无法设置头”。哦。在这种情况下,您能否尝试重新表述您的
res.json(arr)
作为
JSON.parse(JSON.stringify(arr))
?我仍然得到相同的错误,我认为这是因为res.JSON(JSON.parse(JSON.stringify(arr)))在forEach循环中。有什么方法可以处理承诺吗?