2016-12-16 268 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一直是空的。

好吧,我正在編寫一個爬蟲程序,並使用Selenium從服務器獲取響應(Selenium.webdriver可以打開Web瀏覽器,然後執行腳本),我需要得到結果,因爲它將使用另一個程序。所以,我不能只添加另一個,然後輸出這個值。也許我可以保存到本地文件,然後閱讀它,但我認爲效率不高。

任何人都可以幫忙嗎?

+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秒就足以得到反應),但它也表示無法在5秒內得到結果......然後我放棄這種方式,並找到另一種獲得結果的方法。我嘗試在頁面中創建一個元素,並將文本設置爲返回值。之後,搜索我創建的元素。有用!無論如何,謝謝你的建議。 – QLG

回答

2

當您嘗試記錄全局res時,結果尚未計算。當使用的承諾,你必須異步得到的結果,使用.then,像這樣:

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

這個問題顯然是重複的。爲什麼回答它?評論(因爲答案非常簡單),然後搜索重複標記。 – royhowie

+0

是否這樣? http://stackoverflow.com/questions/31909460/javascript-promise-return,哦,來一個,我有搜索它之前,我的問題是不一樣的,因爲「得到的價值」和「使用價值「是兩個部分,也是兩個不同的過程。 – QLG

+0

你可以編輯你的問題,包括你正在使用Selenium的當前代碼? – qxz

2

試試這個 您使用的承諾不正確。

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