Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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 使用.evaluate返回变量_Javascript_Node.js_Screen Scraping_Nightmare - Fatal编程技术网

Javascript 使用.evaluate返回变量

Javascript 使用.evaluate返回变量,javascript,node.js,screen-scraping,nightmare,Javascript,Node.js,Screen Scraping,Nightmare,我不熟悉Javascript、Node.js和噩梦。我正在尝试添加一个功能来计算页面上的标题数量,然后等待标题总数增加5 以下是片段: .evaluate(function () { var elements = Array.from(document.getElementsByClassName('title')); var firstCount = elements.length; var higherCount = firstCount + 5; var s

我不熟悉Javascript、Node.js和噩梦。我正在尝试添加一个功能来计算页面上的标题数量,然后等待标题总数增加5

以下是片段:

.evaluate(function () {
    var elements = Array.from(document.getElementsByClassName('title'));
    var firstCount = elements.length;
    var higherCount = firstCount + 5;
    var selector = '\'#price' + higherCount + '\'';
    return selector;
})
.wait(selector)
当我运行时,我得到一个错误:

.等待(选择器)
^ReferenceError:对象上未定义选择器


如何将变量
选择器
发送到
.wait
命令?

根据文档,函数evaluate将函数的返回值传递给调用者

因此,在您的示例中,调用将是

var selector = page.evaluate(function () {
    var elements = Array.from(document.getElementsByClassName('title'));
    var firstCount = elements.length;
    var higherCount = firstCount + 5;
    var selector = '\'#price' + higherCount + '\'';
    return selector;
});
如果出于某种原因,evaluate调用的内容是异步的,那么可以返回一个承诺

page.evaluate(function () {

    return new Promise( function(success, error) {
        // whatever is the async thing
        success(value);
        // or if there is an error
        error("details of error");
    }

}).then( function (results) {
    // we have our results
}).catch( function(err) { 
    // ... oops
});

这可能与async/await兼容,具体取决于上下文。

您可以向选择器html中添加一些内容,并使用wait()将其作为目标,假设选择器是html元素。像这样的

.evaluate(function () {
    var selector = document.getElementById("demo");
    selector.className += " waitForThis";
})
.wait(".waitForThis")

不过,我认为您不能将evaluate的返回值用于wait()。

感谢gburton的响应,但它没有解决问题。也许有恶梦经历的人会回应。我放弃了恶梦,转而选择了木偶演员。工作完美。