噩梦JS使用.evaluate返回变量

时间:2018-08-20 22:17:59

标签: javascript node.js screen-scraping nightmare

我是Java,Node.js和Nightmare的新手。我正在尝试添加一项功能来计算页面上的标题数量,然后等到标题总数增加5时。

以下是代码段:

AVMutableVideoComposition

运行时出现错误:

  

.wait(选择器)
  ^ ReferenceError:未在对象上定义选择器。

如何获取变量.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) selector命令?

2 个答案:

答案 0 :(得分:0)

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

http://phantomjs.org/api/webpage/method/evaluate.html

因此在您的示例中,呼叫将是

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

如果由于某种原因,评估调用的内容是异步的,则可以返回一个promise;

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

这可能与异步/等待兼容,具体取决于上下文。

答案 1 :(得分:0)

您可以将某些内容添加到您的Selector html中,并使用wait()定位它,前提是您的Selector是html元素。像这样的东西。

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

尽管如此,我认为您不能将评估的返回值用于wait()。