NodeJS / JS - 如何在var不为空之前进行循环wait()?

时间:2018-04-04 16:37:53

标签: javascript node.js nightmare

我的标题几乎描述了它。我在网上搜索过我不能接近我想要的东西。

我的代码:

    const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })
var url = '';

nightmare
  .goto('https://duckduckgo.com')
  .type('#search_form_input_homepage', 'github nightmare')
  .click('#search_button_homepage')
  .wait('#r1-0 a.result__a')
  .evaluate(() => document.querySelector('#r1-0 a.result__a').href)
  .end()
  .then(function(result){
    url = result;
  })
  .catch(error => {
    console.error('Search failed:', error)
  })

//this will throw empty
console.log(url);

//basically i need a loop that can check if url has either changed values or isnt empty but only until it is not empty!

url.change(function(){
  console.log(url);
})

所以我主要在代码中描述它。

如果你可以帮助我会喜欢这个,你真的不需要在噩梦中有一个基本的理解,然后它是一个无头的铬npm,它基本上是幻影.js simplfied

2 个答案:

答案 0 :(得分:1)

为什么不简单地使用您已经拥有的.then

.then(function(result){
  // Instead of this:
  // url = result;
  // Do this:
  console.log(result);
})

答案 1 :(得分:1)

也许这个帖子可以帮到你:

Nightmare conditional wait()

Basicall,你必须写一个动作:

Nightmare.action('deferredWait', function(done) {
  var attempt = 0;
  var self = this;

  function doEval() {
    self.evaluate_now(function(selector) {
      return (document.querySelector(selector) !== null);
    }, function(result) {
      if (result) {
        done(null, true);
      } else {
        attempt++;
        if (attempt < 10) {
          setTimeout(doEval, 2000); //This seems iffy.
        } else {
          done(null, false);
        }
      }
    }, '#elem');
  };
  doEval();
  return this;
});

现在你可以使用它了

var nightmare = Nightmare();
nightmare.goto('http://example.com')
  .deferredWait()
  .then(function(result) {
    console.log(result);
  });