2016-05-19 2 views
1

Nightmare.js(v2.3.3)を使用して、ワークフローの一部を自動化し、データベースを更新するWebサイトにアクセスする必要があります。私は.type,.click.screenshotのような基本的なもののためにナイトメアを働かせて、私がこれらのページにアクセスして、私が意図した情報を入力していることを確認できました。Nightmare.js(v2 Electron)を使用してブラウザからNodeスコープに情報を渡すことはできますか?

私は立ち往生しており、文書が不足しているようで、.evaluateを使用してページから情報を抽出しています。ドキュメントでは、としてそれを持っています

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

var selector = 'h1'; 
var text = yield nightmare 
    .evaluate(function (selector) { 
    // now we're executing inside the browser scope. 
    return document.querySelector(selector).innerText; 
    }, selector); // <-- that's how you pass parameters from Node scope to browser scope 

これはすべてが順調と良いですが、逆の方向に行くと範囲をノードにブラウザの範囲から情報を渡すために、実際に可能ですか?私がしたいのは、ページ上のすべてのチェックボックスを配列として返し、Nightmareスクリプトでループさせることです。

また、私は多くのGitHubの問題とStackOverflowの質問を検索して答えを見つけましたが、以前のバージョンはPhantomJSで構築されていて、v2 +はElectronを使用していると思われるので、現在のバージョンに戻します。 Hereは私にとって理にかなった答えですが、2014年になったので、PhantomJSバージョンである可能性が最も高いと考えています。参考までに、これはスコープをノードにブラウザから転送する方法の答えを持っているように見えたスニペットです:

var p1=1, 
    p2 = 2; 

nightmare 
    .evaluate(function(param1, param2){ 
     //now we're executing inside the browser scope. 
     return param1 + param2; 
    }, function(result){ 
     // now we're inside Node scope again 
     console.log(result); 
    }, p1, p2 // <-- that's how you pass parameters from Node scope to browser scope 
) //end evaluate 
    .run(); 

しかし、悪夢の現在のバージョンは、この.evaluate(fn, cb, arg1, arg2,...)形式をサポートしていることを思えないのですか?

私は自分自身を狂ってしまう前にこれが可能かどうかを知りたいのですが!ご協力いただきありがとうございます。回答に必要な情報が必要な場合にお知らせください。

+0

私は理解していません。あなたの最初のスニペットでは、 'text'はページコンテキストからノードコンテキストに渡された値を含んでいなければなりません。それは? @ArtjomB。 –

+0

私の理解からではありません。 「悪夢をもたらす」とは、命令の連鎖に従って悪夢のインスタンスを開始することだけです。 – rynjwssl

答えて

3

非常に近いです。より最近のアップデートの1つは、ナイトメアをより有望な方法で使用することです。つまり、.evaluate()コールバックを自分で処理する必要はなく、結果はチェーンに渡されます。わずかに微調整あなたの第二の例では、:

nightmare = require('nightmare')(); 
nightmare.goto('http://example.com'); 

var p1=1, 
    p2=2; 

nightmare 
    .evaluate(function(param1, param2){ 
     return param1 + param2; 
    }, p1, p2) 
    .then(function(result){ 
    console.log(result); //prints 3 
    }); 

あなたが.then()を使用することをお勧めしますが、あなたは本当に.run()を使用したい場合は、次のことができます。

nightmare = require('nightmare')(); 
nightmare.goto('http://example.com'); 
var p1=1, 
    p2=2; 

nightmare 
    .evaluate(function(param1, param2){ 
     return param1 + param2; 
    }, p1, p2) 
    .run(function(err, result){ 
    console.log(result); 
    }); 
+0

ありがとう@ロス!私は実際にGitHubの問題を見ていて、 '.then'と約束に私を導いた答えのいくつかを見つけました。全く新しいコンセプトですが、なぜナイトメアがその方向に向かうのですか?したがって、 '.then'に渡されるパラメータはチェーン内の前のタスクの戻り値です。この場合は' .evaluate'ですか?また、 '.run'とは何ですか?私はどこにいてもドキュメントを見つけることができず、ナイトメアのベストプラクティスではありませんか? – rynjwssl

+1

はい、 '.then()'関数のパラメータは前のアクションの結果になります。 (これは少し単純化されていますが、ここでうまくいきます) '.run()'は徐々に廃止予定になっているため、文書化されていません。あなたが好奇心を持っているなら、それに関する会話がここにあります(https://github.com/segmentio/nightmare/issues/575)。 – Ross

+0

助けをありがとう!私はこれを整理しようとしている一週間、壁に頭を叩いていた。私は約束を読み、それを完全に理解できるようにする必要があります。私はちょうど受け入れられた答えとしてあなたを設定しました、うまくいけば、これはナイトメアで始まっている他の人を助けることができます。 – rynjwssl

関連する問題