CefSharp 运行 JavaScript
Posted
技术标签:
【中文标题】CefSharp 运行 JavaScript【英文标题】:CefSharp Running JavaScript 【发布时间】:2021-11-24 11:04:55 【问题描述】:我在 CefSharp 中运行 JS 时遇到了困难,因为命令会一个接一个地运行。基本上,在执行最后一个脚本后,我需要一个等待命令来等待页面加载。
因此它会是:
await Browser.ExecuteScriptAsync(script1);
Browser.WaitForLoad();
Task<javascriptResponse> test = await Browser.EvaluateScriptAsync(script2);
我找到了一些资源,但我只是编程新手,所以我发现要弄清楚如何做我想做的事情有点困难。
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using CefSharp;
using CefSharp.Wpf;
namespace WpfApp2
public partial class MainWindow : Window
private string MessagesInbox;
public MainWindow()
InitializeComponent();
private void Browser_Loaded(object sender, RoutedEventArgs e)
Browser.LoadingStateChanged += async (Sender, args) => if (args.IsLoading == false)
await Browser.EvaluateScriptAsync(@"document.getElementById('User').value = 'test'; document.getElementById('Password').value = 'password'; document.getElementById('LoginButton').click();");
;
Task<JavascriptResponse> test = Browser.EvaluateScriptAsPromiseAsync(@"return new Promise(function(resolve, reject) setTimeout(resolve.bind(null, var test = ''; document.querySelectorAll('.MasterAction').forEach(el => test += el.children[3].children[0].href + ', ')), 2000);");
MessagesInbox = test.Result.ToString();
MessageBox.Show(MessagesInbox);
【问题讨论】:
您当前的代码有什么问题? 目前,我收到“System.Exception: 'Unable to execute javascript at this time, scripts can only be executed within a V8Context”错误。但是在发送返回 Task您还应该检查IsLoading
的第二种方法,您可以使用 bool 来跟踪您是否已经登录,并在该函数中使用第二种方法,如下所示:
public bool loggedIn = false;
private void Browser_Loaded(object sender, EventArgs e)
Browser.LoadingStateChanged += async (Sender, args) =>
if (args.IsLoading == false)
if (!loggedIn)
await Browser.EvaluateScriptAsync(@"document.getElementById('User').value = 'test'; document.getElementById('Password').value = 'password'; document.getElementById('LoginButton').click();")
.ContinueWith(x =>
var response = x.Result;
System.Diagnostics.Debug.WriteLine(response.Result);
if (response.Result == null)
System.Diagnostics.Debug.WriteLine("should be changed to true");
loggedIn = true;
);
else
JavascriptResponse test = await Browser.EvaluateScriptAsync(@"var test = ''; document.querySelectorAll('.MasterAction').forEach(el => test += el.children[3].children[0].href + ', ');test.substr(0,test.length-2)");
MessagesInbox = test.Result.ToString();
System.Diagnostics.Debug.WriteLine(MessagesInbox);
;
【讨论】:
你调用 Reload 有什么原因吗?可以等待 EvaluateScriptAsPromiseAsync 调用 @amaitland 你说得对其实不需要,我更新了我的答案 @AbdullahAkçam,非常感谢您的帮助。我不需要使用承诺,所以我最终得到了我作为编辑提交的代码。我有一个 [reddit 帖子]reddit.com/r/CefSharp/comments/q0fcgv/cefsharp_wait_for_load 也在讨论这个问题,并在那里发布了答案。您可以使用此方法并使用 int 而不是 bool 并使用 if(x==1)else if (x==2) 等等来降低命令。新手,请记住 System.Diagnostics.Debug.WriteLine() 只是在 VS Studio 的输出 shell 中写入一行。以上是关于CefSharp 运行 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章
为 CefSharp 应用内置 C++ 运行环境并启用 AnyCPU 支持
CefSharp"Could not load file or assembly 'CefSharp.Core.dll' or one of its dependencies