2015-01-20 19 views
5

jquery'yi phantomjs ile kullanmaya çalışıyorum. Bağımsız bir örnek denedim ve iyi çalıştı. İşte ne yaptım: includeJs() yürütmek çünkü fonksiyonunu değerlendirmek, ben) setTimeout (kullandık Yukarıdaki kod snippet'indeJQuery, PhantomJs uygulamasına dahil edilmiyor

loading jquery 
message recvd: $("title").text() -> PhantomJS | PhantomJS 

: Burada

var page = require('webpage').create(); 
    page.open("http://www.phantomjs.org", function(status) { 

    page.onConsoleMessage = function(msg) { 
     console.log("message recvd: " + msg); 
    }; 

    var result; 

    page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js", function() { 
     console.log("loading jquery"); 
    }); 

    setTimeout(function() { 
     page.evaluate(function() { 
     console.log("$(\"title\").text() -> " + $("title").text()); 
     }); 
    }, 1000); 
} 

aldığım çıkışı Eşzamansız ve jquery yüklemek için biraz zamana ihtiyacım var. SetTimeout() öğesini kullanmazsam veya zaman aşımı için küçük bir değer kullanmazsam, çalışmaz. Benim uygulamada aynı kodu çalıştığınızda

Ancak çalışmaz. İşte ne var:

var baseSetup = function(guid, page, config, request, response) { 
    /* enable the console output inside the callback functions */ 
    page.onConsoleMessage = function (msg) { 
    console.log(guid + ": console msg: " + msg); 
    }; 

    /* used for ignoring potential alert messages when evaluating js code */ 
    page.onAlert = function (msg) { 
    console.log(guid + " (alert): alert msg: " + msg); 
    }; 

    /* suppress the error messages */ 
    page.onError = function(msg, trace) { 
    var msgStack = ['ERROR: ' + msg]; 
    if (trace && trace.length) { 
     msgStack.push('TRACE:'); 
     trace.forEach(function(t) { 
     msgStack.push(' -> ' + 
     t.file + 
     ': ' + 
     t.line + 
     (t.function ? ' (in function "' + t.function + '")' : '')); 
     }); 
    } 
    console.error(guid + ": " + msgStack.join('\n')); 
    }; 
} 

module.exports = function extractionDriver(responseFromUrl, responseToUser, page, request) { 
    console.log(page.customHeaders['guid'] + ": extractionDriver, status = " + responseFromUrl.status); 

    if(page.isLocalFile || responseFromUrl.status !== 0) 
    { 
    var viewportStr = page.customHeaders['viewportStr']; 
    console.log(page.customHeaders['guid'] + ": Setting viewport size: " + viewportStr); 
    var viewportObj = parseViewport(viewportStr); 
    page.viewport = viewportObj; 

    page.evaluate(function(w,h) { 
     document.body.style.width = w + "px"; 
     document.body.style.height = h + "px"; 
    }, viewportObj.width, viewportObj.height); 

    page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js", function() { 
     console.log("loading jquery"); 
    }); 

    setTimeout(function() { 
     page.evaluate(function() { 
     console.log("$(\"title\").text() -> " + $("title").text()); 
     }); 
    }, 1000); 
    } 

Ve bu benim uygulamayı çalıştırmak gördüğüm değerlerle geçerli:

d8db6045-a0e8-11e4-a619-6949593d958d: ERROR: ReferenceError: Can't find variable: $ 
TRACE: 
-> phantomjs://webpage.evaluate(): 3 
-> phantomjs://webpage.evaluate(): 4 
-> phantomjs://webpage.evaluate(): 4 

günlük çizgi "yükleme jquery" basılmış asla ve jquery yüklü asla.

Ben includeJs ait callback'inde() ancak bu işe yaramadı içine değerlendirmek() fonksiyonunu tamamlamasından denedi ya (hiçbir konsol günlüğü yazdırılır).

Burada yanlış olan ne olabilir? Daha fazla bilgi vermem gerekirse lütfen bana bildirin.

cevap

7

orada jQuery bağlıdır kodu koyabilirsiniz böylece page.includeJs bir geri arama sahiptir yüzden bu. Başvurulan JavaScript yüklendiğinde geri arama çağrılır. Geri arama cehenneme giden yolda başka bir seviyeye hoş geldiniz.

Bunun nedense işe yaramadı olsa bir kez yaşadı. geçici çözüm includeJs geri aramasında global değişkeni ayarlamak ve genel değişken includeJs callback'inde dışında ayarlanması için beklemek waitFor kullanmaktı.

var _loadIndicator = false; 
page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js", function() { 
    _loadIndicator = true; 
}); 

waitFor(function check() { 
    return _loadIndicator; 
}, function onReady() { 
    page.evaluate(function() { 
    console.log("$(\"title\").text() -> " + $("title").text()); 
    }); 
}, 10000); 
+0

denemek ve sadece eklemek istediğiniz jquery .min fiile ... injectJs kullanırsınız ... ama hala benim için çalışmıyor – carinlynchin

+0

@Carine "server" ile ne demek istediğini bilmiyorum, ancak 'page.injectJs' sadece dosya olduğunda kullanılabilir bir dosya yolu ile ulaşılabilir. Değilse, o zaman bir 'URI aracılığıyla erişilebilir olmalıdır. Bu durumda' page.includeJs 'kullanılmalıdır. –

+0

Evet, .. biliyorum ama page.injectJs ('jquery.min.js') olmasına rağmen, ben hala hata olsun "değişken bulunamıyor: $" – carinlynchin

0

Sadece bu ile sorunlarım var ama benim hatam ben phantom.injectJs değil page.injectJs (pislik) çalıştı olmasıydı. Ve sonra, statussuccess ise,

page.injectJs('lib/jquery.min.js'); 

koymak ve ne eğer onun sunucunnuzda ... uzaktan almak istiyorsanız bu

page.evaluate(function(){ 
    console.log($("body").length); 
});