Я пытаюсь смоделировать пользователя, вводящего значение в поле ввода на веб-сайте, и я получаю очень странное исключение при попытке запустить 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();
прекрасно работает.
В чем причина этого исключения?