2016-06-19 5 views
3

Node Horsemanでは、Node内でPhantomJSを使用できます。私たちは、ページのコンテキストにJSコードの一片を実行したい場合は、私たちは何を次のようにNode Horsemanから関数を `evaluate`関数に渡すには?

var Horseman = require('node-horseman'); 
var horseman = new Horseman(); 

horseman.open(pageUrl) 
     .status() 
     .evaluate(function() { 
      // Js Code goes here 
     }) 
     .close(); 

を今、私たちは、評価関数に「外部から」何かを渡したいとします。私はそれが発見されていない評価内部someFunctionを呼び出す場合たとえば、私がしなければ

var Horseman = require('node-horseman'); 
var horseman = new Horseman(); 

function someFunction() {} 

horseman.open(pageUrl) 
     .status() 
     .evaluate(function() { 
      someFunction(); 
     }) 
     .close(); 

を以下に示します。

別の例として、それはまたそこurlオブジェクトを認識しません

var Horseman = require('node-horseman'); 
var url = require('url'); 
var horseman = new Horseman(); 

horseman.open(pageUrl) 
     .status() 
     .evaluate(function() { 
      // try to use url somehow here 
     }) 
     .close(); 

次私は考えます。私は問題を理解している、そのコードは、ページのコンテキストで実行されます。しかし、外部からそれらのものを渡す方法があるので、評価の中でそれらを使うことができますか?

答えて

0

ページのコンテキスト上で実行されたコードについては、あなたの権利があります。あたかもブラウザのコンソールを開いてevalute機能の中にあるすべてのものを貼り付けるかのように考えることができます。

あなたがコンソールにsomeFunction()を貼り付ける場合は、JSランタイムはエラーをスローします:someFunctionはに定義されていません。これは、ページのコンテキスト上で定義されていないためです。

実際には外部から関数を渡すための回避策がありますが、関数がノードのコンテキスト上の他の関数とグローバルオブジェクトに依存しない場合にのみ機能します。ここで

は一例です:

function someFunction() { 
    return document.title; 
} 

horseman.open('http://google.com') 
    .evaluate(function (someFunction) { 
     eval('var sf = ' + someFunction); 
     return sf(); 
    }, someFunction.toString()) 
    .log() //Will print out "Google" 
    .close(); 

URLは実際にはNode.jsのモジュールです。あなたは、任意の同様のクライアント側JSライブラリでそれを代用してみてくださいし、次のいずれかのコマンドでそれを注入することができます

horseman 
    .injectJs(file) 

または

horseman 
    .includeJs(url) 
0
で解決

.evaluate(fn, [arg1, arg2,...]) 
+0

非常だこと曖昧。これがどのように質問のコードに適用できるかを示してください。 –

関連する問題