如何在加载完成的PhantomJS上检测真实页面

时间:2017-03-16 06:05:45

标签: javascript wordpress phantomjs

我正在尝试使用PhantomJS在Wordpress上自动下载主题。正如我的脚本所代表的那样,在停止加载之前不会对页面进行评估,问题如下:

当我尝试单击页面上的元素时,它仍然不可见,因为仍然必须返回对其数据库的查询。即使页面被认为已完成加载,仍有一个重要部分仍然缺失。看看下面:

enter image description here

此页面是在点击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 }

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:1)

等待整页加载的一种方法是收听page.onLoadFinished回调,如果N秒没有再次调用,则考虑页面已完成加载。

另一种方法是比较page.onResourceReceivedonResourceRequested通话计数(可能会考虑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);

希望这会对你有所帮助。