2015-11-06 176 views
1

內部page.evaluate phantom.exit()()我有2個代碼示例如下:不能把在phantomjs

var page = require('webpage').create(); 
page.open('https://www.youtube.com', function(s) { 
    console.log(s); 
    page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { 
    var t = page.evaluate(function() { 
     console.log('here'); 
     phantom.exit();  // case 1: inside page.evaluate() 
    }); 

    }); 
}); 

- >在這種情況下,phantom.exit()內放page.evaluate (),並出現錯誤: 「的ReferenceError:找不到變量:幽靈」

var page = require('webpage').create(); 
page.open('https://www.youtube.com', function(s) { 
    console.log(s); 
    page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { 
    var t = page.evaluate(function() { 
     console.log('here'); 
    }); 
    phantom.exit();   // case 2: outside page.evaluate() 
    }); 
}); 

- >如果2:phantom.exit()放在外面page.evaluate()。沒有錯誤,但'這裏'沒有打印出來。

=>以上兩種方式都不能打印出'這裏'。有沒有什麼有效的方法來打印'在這裏'沒有錯誤?

回答

4

不能使用任何phantom方法的頁面內,以同樣的方式頁面本身不能使用它們。

phantom對象是運行時爲其最初啓動的腳本提供的特殊宿主對象。頁面加載完成後,頁面會在其自己的上下文中使用通常的瀏覽器變量(不包括phantom)運行。

您需要等待page.evaluate回調幻影腳本,然後從那裏調用exit。幻影docs show this exact case,exitevaluate已返回之後被調用。它們似乎不包括evaluate是否阻塞,但示例表明它可能是阻塞的。

要從頁面捕獲日誌消息,您需要訂閱其onConsoleMessage event。 Phantom控制檯僅從正在運行的腳本中選取消息,而不是可能加載的任何頁面。您只需將尋呼消息路由至幻像控制檯:

page.onConsoleMessage = function(msg) { 
    console.log('PAGE: ' + msg); 
}; 
+0

謝謝,我明白了你的觀點:) 我可以問你另一個問題嗎?如果我在page.evaluate(),$ .post(url,function(data){//一些代碼})中放入一個ajax請求,我如何獲取數據並將其打印在page.evaluate()之外? –

+0

@MrCold這是一個有趣的問題。你可以強制ajax調用是同步的,這是不好的做法,但在腳本瀏覽器中不會有害。您還可以使用主機腳本和頁面之間的消息傳遞(使用前綴/協議)來回發送信息。然後你的工作流成爲一個正常的MPI異步。 – ssube

+1

@MrCold我給你覆蓋了[this](http://stackoverflow.com/a/28684532/1816580) –

-1

,請返回需要返回的數據和評估後做的console.log()

var page = require('webpage').create(); 
page.open('https://www.youtube.com', function(s) { 
console.log(s); 
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { 
var t = page.evaluate(function() { 
    return "here"; 
}); 
console.log(t); 
phantom.exit();   // case 2: outside page.evaluate() 
    }); 
}); 
+0

downvote的原因是什麼? –

+0

@ArtjomB。謝謝我錯了那裏,刪除了那一行:) –