当前位置: 首页 > 面试题库 >

噩梦有条件的等待()

乜元魁
2023-03-14
问题内容

我正在尝试使用Nightmare抓取网页,但要等到#someelem它实际存在时才等待出现。否则,我希望梦Night继续前进。如何使用来完成.wait()

我不能用.wait(ms)。使用.wait(selector)手段,噩梦将一直等待直到该元素出现,但如果页面永远不会包含此元素,则噩梦将永远等待。

最后一个选项是使用.wait(fn)。我尝试过这样的事情

.wait(function(cheerio) {
            var $ = cheerio.load(document.body.outerHTML);
            var attempt = 0;

            function doEval() {
                if ( $('#elem').length > 0 ) {
                    return true;
                }
                else {
                    attempt++;

                    if ( attempt < 10 ) {
                        setTimeout(doEval,2000); //This seems iffy.
                    }
                    else {
                        return true;
                    }
                }
            }

            return doEval();
        },cheerio)

因此,请等待并再次尝试(达到阈值),如果找不到该元素,则继续前进。setTimeout周围的代码似乎错误,因为.wait它是在浏览器范围内完成的。

提前致谢!


问题答案:

我认为通过现有cheerio库并不能很好地工作。参数被序列化(或多或少)以传递给子Electron进程,因此传递整个库可能不起作用。

从好的方面来说,的fn一部分.wait(fn)在页面上下文中执行-
意味着您可以完全访问document它及其拥有的方法(例如querySelector)。您也可以访问页面的jQuery上下文(如果存在),或者甚至可以使用.inject()它来注入它。

抛开这一点,就.wait()(并且.evaluate()就此而言)您期望同步方法是正确的,至少直到可以直接在中使用.evaluate()诸如promises之类的情况为止。

在此之前,您可以.action()用来模仿您想要的行为:

var Nightmare = require('nightmare');

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


 类似资料:
  • 问题内容: 好的,这很荒谬:(或者我的设计可能是:) 以下是我们使用的URL: 现在有趣的部分: 如果代码按上述顺序排序,则调用将使用wallName路由到第一条路由!从而得到405。 如果我将其移到底部,则可以正确路由! 现在,这就是我所知道的: Restlet中的默认路由模式是MODE_FIRST_MATCH。我将其设置为MODE_BEST_MATCH,URL的顺序仍然很重要!我无法访问“相似

  • 在EJS中包含外部文件似乎从来没有一种简单的方法。 我的项目结构是这样的。如此简单却让人心痛: 在内部,我必须包含。我很幸运地遵循了他们的文档:https://ejs.co/#docs并以这种方式包含文件,因为“include相对于包含调用的模板”, 在中,我像这样编译模板: 但我却犯了这个错误! 我已经在编译选项中设置了视图路径。我试过有路/无路。我还尝试在相同的视图路径上设置。 我错过了什么?

  • 我们正在两个不同的实例上运行云服务。这个云服务在服务总线队列上旋转一个接收器。此接收器配置为:1。窥视并锁定模式2。自动完成=真3。RenewLockTimeout=10分钟4。MaxConcurrentMessages=1 5。PrefetchCount=默认值(应为0) 几天前,Azure决定更新我们的实例。我从日志中看到,在18.18时,第一个实例被请求停止。在18.24时,该实例停止,并在

  • 问题内容: 我已经构建了一个简单的音乐音序器Android应用程序,可以播放多个音频文件。 最初,我是使用SoundPool播放mp3文件的,它在2.3.4下与旧的HTC Droid Incredible完美配合。然后,我在运行4.3的Galaxy Nexus上进行了测试,其性能令人震惊。整个地方都有音频定时,并且有小故障/咔嗒声/爆裂声。 因此,我花了几天的时间使用包括MP3解码器的AudioT

  • Html树: Xpath://table[@class='ur MatrixLayout urhtmltableReset']//tr//table//tr//td//div//div/span[contains(text(),'revisations')]

  • 我第一次做硒测试。在主页上,我调用了一些AJAX,我希望Selenium等待元素加载完成。我不确定它是否有效,但我只是键入selenium,waitForCondition可以选择。 无论我选择什么,它总是返回“false”。我现在连等待条件都不工作吗? 我如何测试它是否有效?在这些代码中我做错了什么? 如果由自己的类实现,则返回“true” isElementPresent(By.xpath(“