【问题标题】:CefSharp Executescriptasync Return Loop ValueCefSharp Executescriptasync 返回循环值
【发布时间】:2021-05-04 17:53:00
【问题描述】:

我正在尝试在我为实验创建的页面上提取特定的标签值。我是使用 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

【问题讨论】:

    标签: c# visual-studio winforms cefsharp


    【解决方案1】:

    这对我有用。 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());
    

    【讨论】:

    • 我不知道“EvaluateScriptAsync”只会转一次。当我删除循环中的返回码时,它不起作用。当我添加返回时它工作了一次.非常感谢您提供的示例代码块。我尝试了很多示例,但我从未想过转换为 JSON 格式。它执行我想要的功能。作为输出,她一次将所有结果输出到一个字符串中。所以如果我想一个一个输出,我可以用json.parse再次创建一个数组并将其拉出吗?
    • 是的,输出到 JSON 意味着您可以从 JavaScript 返回任何内容,从简单的字符串到数字列表,甚至是具有各种类型或属性的对象列表。这意味着当您在 C# 端获取数据时,您将能够与它们进行交互,而不仅仅是使用字符串进行混淆。 Deffo要走的路。对您而言,在 Visual Studio 中,只需转到 nuget 并将 Newtonsoft JSON 安装到您的项目中。我将使用快速代码示例更新我的答案。
    • 从函数返回单个值是 JavaScript 语言的基础。这同样适用于与 JavaScript 交互的所有 CefSharp 函数。我要指出的是,你可以直接返回一个列表而不用 JSON,你会得到一个 List 的实例,记住 JavaScript 不是强类型的,所以你可以返回一个不同类型的列表,因此使用 List。如果 JSON 更适合您的用例,则不反对使用。
    • @OceanAirdrop 是的,它成功了。非常感谢您的帮助。
    • @Check78 很高兴听到您已经整理好了。
    猜你喜欢
    • 2022-07-08
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2016-05-29
    • 2016-07-20
    • 2011-11-25
    相关资源
    最近更新 更多