我正在嘗試製作抓取工具,並且由於數據未在頁面源中顯示,因此我只能使用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瀏覽器,然後執行腳本),我需要得到結果,因爲它將使用另一個程序。所以,我不能只添加另一個,然後輸出這個值。也許我可以保存到本地文件,然後閱讀它,但我認爲效率不高。
任何人都可以幫忙嗎?
您使用的承諾不正確。 '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秒就足以得到反應),但它也表示無法在5秒內得到結果......然後我放棄這種方式,並找到另一種獲得結果的方法。我嘗試在頁面中創建一個元素,並將文本設置爲返回值。之後,搜索我創建的元素。有用!無論如何,謝謝你的建議。 – QLG