我认为通过现有
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); });


