CefSharp Executescriptasync Return 循环值

CefSharp Executescriptasync Return Loop Value

我正在尝试在我为 experiment.I 刚开始使用 Cefsharp 创建的页面上提取特定的标签值。我正在尝试改进 myself.I 在 EvaluateScriptAsync 部分卡住了大约两天。

我正在尝试捕获页面上特定标签中按钮的值我prepared.I运行下面的代码通过按一个button.My页面有3个按钮使用相同的 label.However,它只打印其中一个。

<input type="button" id ="button1" value="First Button">
<input type="button" id ="button2" value="Second Button">
<input type="button" id ="button3" value="Third Button">

这些是我要查找的按钮。

string script = @"(function() { " +
    "var button = document.querySelectorAll('input[type = \"button\"]'); " +
    "if(button != null) {for (var i = 0; i < button.length; i++) {  return button[i].value; 
    }}else{alert('not found!');}" +
"})();";

 chrome.EvaluateScriptAsync(script).ContinueWith(a =>{
       var response = a.Result;
       if (response.Success && response.Result != null)
       {
           string print = (string)response.Result;
           MessageBox.Show(print.ToString());
       }
 }, TaskScheduler.FromCurrentSynchronizationContext());

我试过 many.I 认为我在 javascript 中犯了一个错误 part.I 已经阅读了大部分类似的 topics.But 我找不到解决方案.

output : First Button

这对我有用。 EvaluateScriptAsync 函数只能 return 1 个值或一个字符串,因此我确保将 JavaScript 中的结果转换为 JSON 字符串对象。

然后当您在 C# 中检索结果时,您可以使用 JSON 将其转换回对象(在本例中为字符串列表)并对数据执行所需的任何操作.

// Step 01: Generate a HTML page
var htmlPage = @"
<html>
    <body>
        <p>Hello!!</p>
        <input type='button' id='button1' value='First Button'>
        <input type='button' id='button2' value='Second Button'>
        <input type='button' id='button3' value='Third Button'>
    </body>
</html>";

// Step 02: Load the Page
m_chromeBrowser.LoadHtml(htmlPage, "http://customrendering/");

// Step 03: Get list of buttons on page from C# land
var jsScript = @"

// define a temp function to retrieve button text
function tempFunction() {
   var result = [];
   var list = document.querySelectorAll('input[type=button]');

   for(var i = 0, len = list.length; i < len; i++) {   
      result.push(list[i].value);
   }

   // Important: convert object to json string before returning to C#  
   return JSON.stringify(result);
}

// Now execute the temp function and returns result back to C#
tempFunction();";

var task = m_chromeBrowser.EvaluateScriptAsync(jsScript);

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

        if (response.Success == true)
        {
            // Use JSON.net to convert to object;
            MessageBox.Show(response.Result.ToString());
        }
    }
}, TaskScheduler.FromCurrentSynchronizationContext());

看看你的 JavaScript 代码示例,你的代码的问题是在你的循环中你有一个 return 语句,它只会 return 它遇到的第一个按钮值.那是你的问题。

如果您想在 C# 中与生成的列表进行交互,您需要将其从 JSON 字符串转换回来。只需转到 nuget 并将 'Newtonsoft.Json' 包安装到您的项目中。

然后你可以这样写:

// C# land    
var list = new List<string>();
list = JsonConvert.DeserializeObject<List<string>>(response.Result.ToString());