Обработка IE Для заполнения формы C#
Я хочу перемещаться по веб-сайту, входить в систему и заполнять форму через мое приложение, ничего не видя пользователям, и, наконец, показать его пользователям для отправки.
Ранее я использовал контроль веб-браузера. Обычно это работает, но иногда возникает ошибка на сайте после отправки пользователем формы. но в IE эта ошибка не возникает с теми же данными.
Есть ли способ навигации и заполнения форм с моими данными в IE напрямую, а затем показать их пользователям? (этот сайт имеет так много клиентских элементов управления, что я должен ждать, чтобы ответить им на мои данные (например, загрузить города после выбора штата)
1 ответ
Вы можете автоматизировать экземпляр Internet Explorer из своего приложения C#. Сначала создайте сборку взаимодействия SHDocVw.dll
с TlbImp.exe ieframe.dll
и добавьте его как ссылку на ваш проект. Затем используйте следующий код для создания экземпляра Internet Explorer вне процесса:
var ie = (SHDocVw.WebBrowser)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application"));
ie.Visible = true;
ie.Navigate("http://www.example.com");
Используйте его так же, как вы использовали WebBrowser
контроль.
Тем не менее, я считаю, что вы все еще можете использовать хостинг WebBrowser
для того, чего вы хотите достичь, просто внедрите элемент управления функциями, чтобы он вел себя так же, как IE (или как можно ближе).
[ИЗДАНО] Этот невинный пример, однако, может иметь скрытую выгоду. Поскольку здесь вы автоматизируете COM-объект вне процесса, его события (если вы их обрабатываете) могут поступать в поток, отличный от вашего основного потока пользовательского интерфейса. Как правило, вам необходимо перенаправить их обратно в ваш основной поток, используя Control.Invoke или SynchronizationContext.Post/ Send (в зависимости от того, хотите ли вы обрабатывать их асинхронно или синхронно). Вот пример обработки DocumentComplete и забота о потоке:
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
namespace WinformsIE
{
public partial class Form1 : Form
{
public Form1()
{
SetBrowserFeatureControl();
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs ev)
{
var ie = (SHDocVw.InternetExplorer)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application"));
ie.Visible = true;
Debug.Print("Main thread: {0}", Thread.CurrentThread.ManagedThreadId);
ie.DocumentComplete += (object browser, ref object URL) =>
{
string url = URL.ToString();
Debug.Print("Event thread: {0}", Thread.CurrentThread.ManagedThreadId);
this.Invoke(new Action(() =>
{
Debug.Print("Action thread: {0}", Thread.CurrentThread.ManagedThreadId);
var message = String.Format("Page loaded: {0}", url);
MessageBox.Show(message);
}));
};
ie.Navigate("http://www.example.com");
}
}
}