处理IE填写表单c#

我想浏览一个网站,通过我的应用程序登录并填写表格,而不会看到任何用户,最后将其显示给用户提交。

以前我用过webbrowser控件。 它通常有效,但有时,用户提交表单后会在网站上引发一些错误。 但是在IE中,这个错误不是用相同的数据引起的。

有没有办法直接在IE中导航和填充表格,然后将其显示给用户? (这个站点有很多客户端控件,我必须等待它们响应我的数据(例如在选择状态后加载城市)

您可以从C#应用程序自动化Internet Explorer实例。 首先,使用TlbImp.exe ieframe.dll创建互操作程序集SHDocVw.dll ,并将其添加为项目的引用。 然后使用以下代码创建Internet Explorer的进程外实例:

 var ie = (SHDocVw.WebBrowser)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application")); ie.Visible = true; ie.Navigate("http://www.example.com"); 

以与使用WebBrowser控件类似的方式使用它。

也就是说,我相信您仍然可以将托管的WebBrowser用于您想要实现的目标,只需实现function控制 ,使其行为与IE相同(或尽可能接近)。

[编辑]然而,这个无辜的例子可能有一个隐藏的捕获。 因为您在此处自动化了一个进程外COM对象,所以它的事件(如果您处理任何事件)可能会到达与您的主UI线程不同的线程。 通常,您需要使用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"); } } }