C # CefSharp chromeBrowser Пытается имитировать нажатия клавиш и щелчки мыши

#c# #cefsharp

#c# #cefsharp

Вопрос:

Я в недоумении, просмотрев соответствующие сообщения и документацию, у многих других, похоже, были похожие проблемы, но ни одно из существующих решений не приводит к тому, что какие-либо нажатия клавиш фактически распознаются браузером.

Весь мой код приведен ниже, просто пустая форма, пытающаяся ввести имя пользователя / пароль на веб-сайте, на котором в настоящее время нет API, но он появится. Так что это всего лишь исправление проблемы, пока их API не будет доработан. В основном просто нужно войти в систему и отправить нажатия клавиш на веб-сайт, но, похоже, ничего не работает.

Я также пробовал: https://ourcodeworld.com/articles/read/520/simulating-keypress-in-the-right-way-using-inputsimulator-with-csharp-in-winforms

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;


namespace Hydros_tmp_api
{
    public partial class Form1 : Form
    {
        public ChromiumWebBrowser chromeBrowser;
        string CurrentAddress = "";

        public void InitializeChromium()
        {
            CefSettings settings = new CefSettings();
            // Initialize cef with the provided settings
            Cef.Initialize(settings);
            // Create a browser component
            chromeBrowser = new ChromiumWebBrowser("https://www.coralvuehydros.com/app/#/status");
            // Add it to the form and fill it to the form window.
            Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;
            (chromeBrowser).LoadingStateChanged  = Browser_FrameLoadEnd;

            chromeBrowser.AddressChanged  = Browser_AddressChanged;
        }
        public Form1()
        {
            InitializeComponent();
            InitializeChromium();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        async void Browser_FrameLoadEnd(object sender, LoadingStateChangedEventArgs e)
        { // Jumps in here when the page is fully loaded:
            if (e.IsLoading == false)
            {
                if (CurrentAddress.Contains("login"))
                {
                    timer_login.Enabled = true;
                }
            }
        }

        private void Browser_AddressChanged(object sender, AddressChangedEventArgs e)
        {
            CurrentAddress = e.Address;
        }

        private void timer_login_Tick(object sender, EventArgs e)
        {
            timer_login.Enabled = false;
                    chromeBrowser.GetBrowserHost().SetFocus(true);
                    Random rnd = new Random();


                    chromeBrowser.GetBrowser().GetHost().SendKeyEvent(new KeyEvent
                    {
                        WindowsKeyCode = (int)Keys.Tab, // Enter
                        FocusOnEditableField = true,
                        IsSystemKey = false,
                        Type = KeyEventType.KeyDown
                    });

                    System.Threading.Thread.Sleep(rnd.Next(20, 120));

                    chromeBrowser.GetBrowser().GetHost().SendKeyEvent(new KeyEvent
                    {
                        WindowsKeyCode = (int)Keys.Tab, // Enter
                        FocusOnEditableField = true,
                        IsSystemKey = false,
                        Type = KeyEventType.KeyUp
                    });

                    System.Threading.Thread.Sleep(rnd.Next(20, 120));

                    chromeBrowser.GetBrowser().GetHost().SendKeyEvent(new KeyEvent
                    {
                        WindowsKeyCode = (int)Keys.T, // Enter
                        FocusOnEditableField = true,
                        IsSystemKey = false,
                        Type = KeyEventType.KeyDown
                    });

                    System.Threading.Thread.Sleep(rnd.Next(20, 120));

                    chromeBrowser.GetBrowser().GetHost().SendKeyEvent(new KeyEvent
                    {
                        WindowsKeyCode = (int)Keys.T, // Enter
                        FocusOnEditableField = true,
                        IsSystemKey = false,
                        Type = KeyEventType.KeyUp
                    });

                    System.Threading.Thread.Sleep(rnd.Next(20, 120));

        }

    }
}
 

Редактировать: похоже, это особая странность с их веб-сайтом, который не принимает имитированный ввод, потому что он отлично работает на других сайтах? Так что я знаю, куда идти дальше.

Комментарии:

1. Возможно, вы захотите попробовать другой подход. Запустите fiddler, запишите, что отправляется. Повторите в своем коде с помощью httpwebclent . Код будет проще и стабильнее.

2. Из-за того, как этот конкретный веб-сайт рисует себя с помощью canvas и тому подобное, я действительно не думаю, что это достижимо в httpwebclient.

3. Работает ли веб-сайт, если вы используете версию WPF и используете клавиатуру и мышь, как обычно? Версия WPF использует sendKeyEvent внутренне для обработки всех нажатий клавиш. Вы можете протестировать с github.com/cefsharp/CefSharp.MinimalExample

4. Вы можете добавить некоторые записи в github.com/cefsharp/CefSharp/blob/cefsharp/87/CefSharp.Wpf /…

5. Веб-сайт работает нормально, если я набираю вручную, просто не с помощью программного ввода. как с использованием WPF, так и с минимальными последствиями