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());
我正在尝试在我为 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());