【问题标题】:CefSharp Running JavaScriptCefSharp 运行 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 的第二个命令之前,我需要页面等待加载

标签: javascript c# wpf cefsharp


【解决方案1】:

您还应该检查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 中写入一行。
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2015-08-08
  • 2018-07-16
  • 2016-07-05
  • 1970-01-01
相关资源
最近更新 更多