winforms CefSharp执行脚本同步返回循环值

hgb9j2n6  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(215)

我正在尝试提取特定的标签值 在我为实验而创建的一个页面上。我是Cefsharp的新手。我正试图通过实验来提高自己。我在EvaluateScriptAsync部分被困了大约两天。
我在尝试捕捉 在我准备的页面上的特定标签中的按钮。我通过按下一个按钮来运行下面的代码。我的页面有3个具有相同标签的按钮。但是,它只打印其中一个。

<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());

我已经尝试了很多。我想我在javascript部分犯了一个错误。我已经阅读了大多数类似的主题。但我不能找到一个解决方案。

output : First Button
rhfm7lfc

rhfm7lfc1#

EvaluateScriptAsync函数只能返回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语句,它只返回它遇到的第一个按钮值。这就是你的问题。
如果你想在C#中与结果列表交互,你需要将它从JSON字符串转换回来。只需转到nuget并将“Newtonsoft.Json”包安装到你的项目中。
然后你可以这样写:

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

相关问题