2016-12-16 8 views
1

クローラを作成しようとしていますが、データがページソースに表示されないため、Webドライバでjavascriptを実行してレスポンスを取得してからデータ解析を実行できます。 スクリプトは簡略化されており、このようにPromiseを使用します。Javascript Promise戻り値

var res = "" 

function f1() { 
    p = window.Promise 
    a = p.resolve(5).then(function(value) { 
     console.log(value) 
     res = value 
     return res 
    }) 
    return a 
} 
console.log(f1()) // Promise object 
console.log("result = ", res) // res is empty 

私のプログラムは、C#で書いて、このようなものです:

public void GetParameters(string url) 
     { 
      IWebDriver driver = new ChromeDriver(); 
      driver.Navigate().GoToUrl(url); 
      IJavaScriptExecutor js = driver as IJavaScriptExecutor; 
      string script = readFile(@"C:\myscript.js", Encoding.UTF8).TrimEnd(); // The script is a bit long, so I save it to a local file. 
      var json = js.ExecuteScript(script); 
      Console.WriteLine("Get the return value"); 
      Console.WriteLine(json); 
      driver.Close(); 
     } 

私は値を取得したい、と私はthenはいつも約束オブジェクトを返す知っているので、私は、変数を定義し、保存したいですその価値。しかし、Promiseは非同期で実行されるため、resは常に空です。

OK、私はクローラを書いていて、サーバーから応答を得るためにSeleniumを使用しています(Selenium.webdriverはWebブラウザを開いてスクリプトを実行できます)。別のプログラム。だから、別の.thenを追加するだけでは値を出力することはできません。たぶん、私はローカルファイルに保存し、それを読むことができますが、それは非効率的だと思います。

誰でも手助けできますか?

+0

約束が間違っています。 'f1()。then(res => console.log( 'result ='、res))'を実行します。詳細については、[mdn](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)を参照してください。 – royhowie

+0

代わりに['executeAsyncScript'を探しています(https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/JavascriptExecutor.html#executeAsyncScript-java.lang.String-java)。 .lang.Object ...-)? (これはJavaのドキュメントですが、C#の場合と同様のものが必要です)。 'executeScript'はあなたには明らかにない同期JavaScript用のようです。私があなたの質問を正しく理解していれば、あなたはJavaScriptを制御できませんか?しかし、はい、約束は非同期です。 –

+0

年、C言語でexecuteAsyncScript関数もありますが、私が呼び出すと、0秒で結果を得ることができないというエラーがスローされます。その後、タイムアウト時間を5秒に設定しますレスポンス)、それは5秒で結果を得ることができないと言った...そして、私はこのようにして、私は結果を得る別の方法を見つける。私は、ページに要素を作成し、テキストを戻り値に設定しようとします。その後、作成した要素を検索します。できます!とにかく、ありがとうございました。 – QLG

答えて

2

グローバルresをログに記録すると、結果はまだ計算されていません。約束を使用している場合、あなたはこのように、.thenを使用して、非同期に結果を取得する必要があります。

f1().then(res => console.log("result =", res)); 
+0

この質問は明らかに重複していました。なぜそれに答える?コメント(答えはとても単純なので)、重複を検索してフラグを立てます。 – royhowie

+0

このように? http://stackoverflow.com/questions/31909460/javascript-promise-return、ああ、私はそれを前に検索しています。私の問題はそれと同じではありません。なぜなら、「値を取得する」と「値を使用する」 "2つの部分、また2つの異なるプロセスです。 – QLG

+0

Seleniumで作業している現在のコードを含むように質問を編集できますか? – qxz

2

はあなたが間違って約束を使用している これを試してみてください。

f1().then(res => console.log('result=', res)).