处理IE填写表格c#
本文关键字:表格 IE 处理 | 更新日期: 2023-09-27 18:28:52
我想浏览一个网站,登录并通过我的应用程序填写表格,而不会看到用户任何东西,最后将其显示给用户进行提交。
以前我使用网络浏览器控件。它通常工作,但有时,在用户提交表单后,网站上会出现一些错误。但在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");
}
}
}