クローラを作成しようとしていますが、データがページソースに表示されないため、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を追加するだけでは値を出力することはできません。たぶん、私はローカルファイルに保存し、それを読むことができますが、それは非効率的だと思います。
誰でも手助けできますか?
約束が間違っています。 'f1()。then(res => console.log( 'result ='、res))'を実行します。詳細については、[mdn](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)を参照してください。 – royhowie
代わりに['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を制御できませんか?しかし、はい、約束は非同期です。 –
年、C言語でexecuteAsyncScript関数もありますが、私が呼び出すと、0秒で結果を得ることができないというエラーがスローされます。その後、タイムアウト時間を5秒に設定しますレスポンス)、それは5秒で結果を得ることができないと言った...そして、私はこのようにして、私は結果を得る別の方法を見つける。私は、ページに要素を作成し、テキストを戻り値に設定しようとします。その後、作成した要素を検索します。できます!とにかく、ありがとうございました。 – QLG