2017-02-09 1585 views
1

我有一個Winforms應用程序,它具有ChromiumWebBrowser控件和一些基本的Windows控件。我希望能夠點擊一個按鈕,調用JavaScript來獲取瀏覽器中的文本框的值,並將返回的值複製到winforms應用程序中的文本框中。這裏是我的代碼:使用javascript從CefSharp瀏覽器獲取文本框的值

string script = "(function() {return document.getElementById('Email');})();"; 

string returnValue = ""; 

var task = browser.EvaluateScriptAsync(script, new { }); 

await task.ContinueWith(t => 
    { 
     if (!t.IsFaulted) 
     { 
      var response = t.Result; 
      if (response.Success && response.Result != null) 
      { 
       returnValue = (string)response.Result; 
      } 
     } 
    }); 

txtTarget.Text = returnValue; 

說回來然而,結果卻「{}」。我在Chrome中加載了相同的網頁,並在開發工具中執行了相同的JavaScript,並獲得了預期的文本框值。

我看到的演示有示例代碼,只是「返回1 + 1;」,當我試圖獲得值「2」返回而不是「{}」。有趣的是,當我嘗試

string script = "(function() {return 'hello';})()"; 

我仍然收到「{}」,就好像這不適用於字符串。

我一直在這裏撓頭,一直未能弄清楚如何解決這個問題。我是否犯了一個非常基本的語法錯誤,還是有更復雜的事情發生?

+0

您可能過早執行腳本,請參閱一般用法指南瞭解詳細信息。 – amaitland

+0

單擊按鈕時會執行該腳本,因此,如果我可以等待,只要我想要,就無法加載該頁面 – jardantuan

回答

3

所以我想我已經想通了:

string script = "(function() {return document.getElementById('Email').value;})();"; 
string returnValue = ""; 

var task = browser.EvaluateScriptAsync(script); 

await task.ContinueWith(t => 
{ 
    if (!t.IsFaulted) 
    { 
     var response = t.Result; 

     if (response.Success && response.Result != null) 
     { 
      returnValue = response.Result.ToString(); 
     } 
    } 
}); 

txtTarget.Text = returnValue; 

卸下參數對象從EvaluateScriptAsync似乎解決這個問題。不知道是什麼問題 - 也許它試圖運行JavaScript函數與一個空的ARGS對象,當它不應該採取任何參數?

無論哪種方式,現在解決了。

相關問題