CasperJS注入客户端javascript没有完全加载?

时间:2015-06-24 17:40:16

标签: javascript jquery ajax phantomjs casperjs

我目前正在使用

注入一个include.js.
casper.options.clientScripts.push('./include.js')

这是include.js(确保所有ajax请求都已完成:Using $.ajaxStop() to determine when page is finished loading in CasperJS

(function(){
    window._allAjaxRequestsHaveStopped = false;
    var interval;
    console.log('injecting include js')
    $.ajaxSetup({'global':true});
    $(document).ajaxStop(function() {
        console.log('NO MORE outstanding ajax calls');
        if (interval) {
            clearInterval(interval);
            interval = null;
        }
        interval = setTimeout(function() {
            window._allAjaxRequestsHaveStopped = true;
        }, 1000);
    });
    $(document).ajaxStart(function() {
        console.log('NEW ajax call');
        if (interval) {
            clearInterval(interval);
            interval = null;
        }
    });
    console.log('include js loaded');
})();

问题在于有时ajaxStop& ajaxStart函数不会被加载但它总是输出第一个console.log'injecting include js'。

CasperJS脚本

casper.waitForAjax = (callback) ->
    fn_wait = ->
        casper.evaluate ->
            return window._allAjaxRequestsHaveStopped

    casper.waitFor fn_wait, callback

casper.options.clientScripts.push('./include.js')
casper.options.waitTimeout = 10000

describe 'Main Test', ->
    before ->
        casper.start 'url', ->
            phantom.clearCookies()

    it 'Test Case 1', ->
        casper.then ->
            @click 'button' 
        casper.waitForAjax ->
            // Move on with test

所以有时我的代码会超时等待window._allAjaxRequestsHaveStopped转为true而其他时候它会正常工作。我也在我知道有ajax请求的同一页面上进行测试。有谁知道如何解决这种不一致问题?

1 个答案:

答案 0 :(得分:0)

知道了!因此,似乎只有部分脚本被加载,一旦它到达$(document).ajaxStop()就会出现错误,因为jQuery尚未加载到页面上。 CasperJS有时会在加载jQuery之后注入include文件,这就是它有时工作的原因。

通过下载jQuery并在包含文件之前手动注入它来修复它:

casper.options.clientScripts.push('./jquery-2.1.4.min.js')
casper.options.clientScripts.push('./include.js')