我正在尝试使用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(“