Использование InvokeMember с WPF WebBrowser HTMLElement выдает исключение - PullRequest
0 голосов
/ 04 октября 2018

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

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: '' System.MarshalByRefObject.InvokeMember (string, System.Reflection.BindingFlags, System.Reflection.Binder, object [], System.Reflection.ParameterModifier [], System.Globalization.CultureInfo, string []) 'недоступен из-за уровня защиты'

Это пример кода, воссоздающего проблему:

MainWindow.xaml

<Window x:Class="Example.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Example"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
    <DockPanel>
        <WebBrowser x:Name="ie"/>
    </DockPanel>
</Window>

MainWindow.xaml.cs

using mshtml;
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Navigation;

namespace Example
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            ie.LoadCompleted += (o, e) =>
            {
                BackgroundWorker worker = new BackgroundWorker();
                worker.DoWork += (wo, we) => { Thread.Sleep(5000); };
                worker.RunWorkerCompleted += (wo, we) => { DelayedLoadCompleted(); };
                worker.RunWorkerAsync();
            };

            ie.Navigate(@"https://google.com");
        }

        private void DelayedLoadCompleted()
        {
            HTMLDocument doc = (ie.Document as HTMLDocument);

            dynamic input = doc.getElementById("lst-ib");

            input.InvokeMember("onkeypress", new { Key = 65 }); //throws that excetpion
            input.InvokeMember("click"); //throws that excetpion
            input.click(); //works fine
        }
    }
}

Строка input.InvokeMember("click"); выдает этоисключение, но input.click(); прекрасно работает.

В чем причина этого исключения?

...