2013-05-22 12 views
27

Ben bir PhantomJs newbie. Sadece bu sitede benzer bir gönderiyi kontrol ettim. Sorum şu: 'foo' konsola veya yazdırılmaya neden kaydedilmedi?phantomjs page.evaluate konsoluna giriş yapmıyor

var page = require('webpage').create() 
var foo = 42; 

function evaluate(page, func) { 
    var args = [].slice.call(arguments, 2); 
    var fn = "function() { return (" + func.toString() + ").apply(this, " + JSON.stringify(args) + ");}"; 
    return page.evaluate(fn); 
} 

page.open('http://google.com', function() { 
    var foo = 42; 
    evaluate(page, function(foo) { 
    console.log(foo); 
     },foo); 

}); 

cevap

48

Arama sayfası.evaluate() değerlendirilen kodunuzu bir sanal alanda çalıştırır. Sandbox'ın konsolu, PhantomJS'nin konsoluyla aynı değil.

Scriptinize aşağıdaki satırlar eklendiğinde, sayfanızın konsolunu stderr'e yazdırır.

var system = require('system'); 

page.onConsoleMessage = function(msg) { 
    system.stderr.writeLine('console: ' + msg); 
}; 

bir daha tam uygulama olacaktır:

var page = require('webpage').create() 
var system = require('system'); 
var foo = 42; 

page.onConsoleMessage = function(msg) { 
    system.stderr.writeLine('console: ' + msg); 
}; 

function evaluate(page, func) { 
    var args = [].slice.call(arguments, 2); 
    var fn = "function() { return (" + func.toString() + ").apply(this, " +  JSON.stringify(args) + ");}"; 
    return page.evaluate(fn); 
} 

page.open(
    'http://google.com', 
    function() { 
    var foo = 42; 
    evaluate(
     page, 
     function(foo) { 
     console.log(foo); 
     }, 
     foo 
    ); 

    console.log("Done"); 

    phantom.exit(0); // must exit somewhere in the script 
    } 
); 

Çıkışlar: URL'nizden sanki:

$ phantomjs /tmp/idiot.js 
console: 42 
Done 

arada, "boş hakkında" seçeneğini kullanarak page.open çağırabilir değerlendirme fonksiyonunu test etmek için sadece sanal alanı test etmek istiyorsunuz.

+0

Sadece ekledim ve hiçbir şey olmadı. asılı. çıkmıyor bile. Bu, ilk önce hangi işlevi etkinleştireceğini bilmemesi anlamına gelir. page.open veya page.onConsoleMessage! ve ana işlev yok! Herhangi bir hata ayıklayıcı var mı? – Raaj

+0

Kızgın kuş 'foo' değişkenini kaçırdım: ** '}, foo);' **. Teşekkürler. Sayfayı nereden alabilirim. işlevler? onlar için herhangi bir ctags var. Bu javascripts araçsız gerçek zamanlı atık.python'dan alabileceğim bir şey var. eğer değilse, bu phantomjs javascripts'u os.shell'den başka python'a nasıl aktaracağım. Pyphantomjs denedim ama çok inandırıcı değil. – Raaj

+0

bunu [link] almıştır (http://stackoverflow.com/questions/13287490/is-there-a-way-to-use-phantomjs-in-python). iyi görünüyor. ajax değerleri yükler kadar bekleyip beklemediğini merak ediyorum. izin ver deneyeyim. – Raaj

17

standart hataya Çıktı beni

bir çalışma etrafında atayan için işe yaramadı:

window.console.log = function(msg) { alert(msg) }; 

page.evaluate iç

Sonra kullanın:

page.onAlert = function(msg) { 
    console.log(msg); 
}; 

için uyanışı yakala

+0

Benim için çalıştı. +1 –

+0

Benim için de çalışıyordu. +1 – timwebdev

0

Bazı Google Closure testlerini otomatikleştirmek ve hata ayıklamak için ihtiyacım olan bir sorunla karşılaşmak için phantomjs kullanıyorum. Test sayfamdan özel etkinlikler gönderebiliyor ve bunları page.evaluate içine alabiliyordum.

Dosya mesajları oturum:

function logger(msg) { 
    var evt = document.createEvent('CustomEvent'); // MUST be 'CustomEvent' 
    evt.initCustomEvent('logger', false, false, msg); 
    document.dispatchEvent(evt); 
} 

logger('my debug message'); 

Phantomjs dosyasını. Burada dizeyi saklamak için saveMessage yöntemini kullanıyorum, ancak bunu ihtiyaçlarınıza daha uygun bir hale getirebilirsiniz.

var exec = page.evaluate(function() { 
    window.phantomRunner = new window.goog.testing.TestRunner(); 
    window.phantomTest = new window.goog.testing.TestCase(); 

    // Listen for `logger` events. The message is stored inside the event's detail property. 
    document.addEventListener('logger', function(e) { 
    window.phantomTest.saveMessage(e.detail); 
    }); 

    window.phantomTest.autoDiscoverTests(); 
    window.phantomRunner.initialize(window.phantomTest); 
    window.phantomRunner.execute(); 
    return (window.phantomTest.result_.messages); 
}) 
0

sizin phantomjs ayar JavaScript yürütülür devre dışı bırakmaz emin olun

page.settings.javascriptEnabled = true; 
8

Orada konsol günlüğü ile geçmişte bazı sorunlar vardı, ama phantomjs üzerinde güncel sürümü (1.9.8) ile şunları yapabilirsiniz yapın:

page.onConsoleMessage = function (msg) { 
    console.log(msg); 
}; 

sonra evaluate 'ın geri aramasında sizin console.log s uzağa ateş:

page.evaluate(function() { 
    console.log("some logged message"); 
}); 
İlgili konular