处理IE填写表格c#

Handle IE To filling a form c#

本文关键字:表格 IE 处理      更新时间:2023-09-26

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

以前我使用网络浏览器控件。它通常工作,但有时,在用户提交表单后,网站上会出现一些错误。但在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来实现您想要实现的目标,只需实现功能控制,使其行为与IE相同(或尽可能接近)。

[EDITED]然而,这个无辜的例子可能有一个隐藏的陷阱。因为您在这里自动化了进程外的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");
        }
    }
}