我正在尝试使用PhantomJS在Wordpress上自动下载主题。正如我的脚本所代表的那样,在停止加载之前不会对页面进行评估,问题如下:
当我尝试单击页面上的元素时,它仍然不可见,因为仍然必须返回对其数据库的查询。即使页面被认为已完成加载,仍有一个重要部分仍然缺失。看看下面:
此页面是在点击install now
按钮后呈现的。正如你所看到的,主题卡还没有出现。相反,唯一可以看到的是小旋转器。
这个小家伙已经导致任何与主题相关的脚本成为空对象,这显然是非常不受欢迎的。
有人知道如何解决这个问题吗?我已经尝试了setTimeout()
,但这是一种非常难看的方法,实际上我的测试从未成功过。谢谢!
添加信息
我的程序的所有功能都会在一段时间后执行。这是通过实现setInterval
属性来完成的。它运行完美,但我的问题的解决方案现在如何在函数执行时动态设置间隔时间?
以下代码示例:
var steps = [
function() {
console.log('Going')
page.open('http://google.com')
//Does not need too much time.
},
function() {
console.log('Searching')
page.evaluate(function() {
//BIG Task List Here, Needs A lot of Time
})
}]
//How the interval is set:
setInterval(executeRequestsStepByStep, 250)
function executeRequestsStepByStep(){
if (loading == false && steps[stepindex]) {
steps[stepindex]()
stepindex++
}
if (!steps[stepindex]) {
phantom.exit()
}
}
page.onLoadStarted = function() { loading = true }
page.onLoadFinished = function() { loading = false }
关于如何实现这一目标的任何想法?
答案 0 :(得分:1)
等待整页加载的一种方法是收听page.onLoadFinished
回调,如果N秒没有再次调用,则考虑页面已完成加载。
另一种方法是比较page.onResourceReceived
和onResourceRequested
通话计数(可能会考虑onResourceError
)。但是乏味且不可靠。
上述两个选项都不适用于ajax请求,因为它显然不是初始页面加载周期的一部分。
我认为你的微调器是在ajax请求期间生成的,所以最好的选择可能是等待微调器的消失。我还建议包括一个单独的更大的安全超时,比如30秒,然后调用phantom.exit(1)
。因此,如果这个ajax调用永远不会结束,那么你的脚本将无限期地挂起。
答案 1 :(得分:1)
正如 Vaviloff 所说,你可以遵循这些方法。但是我有一个对我来说很有用的解决方案,例如上面的场景是waitFor
https://github.com/ariya/phantomjs/blob/master/examples/waitfor.js
如果需要30秒或更长时间,此脚本将退出,否则只要加载程序消失,它将继续执行后续步骤
waitFor(function() {
return page.evaluate(function() {
if (loader disappears) {
return true;
} else {
return false;
}
});
}, function() {
// do your next steps here
}, 30000);
希望这会对你有所帮助。