我想導航一個網站,通過我的應用程序登錄並填寫一個表單,而不會看到任何用戶,最後顯示給用戶提交。處理IE填寫表單c#
以前我使用過webbrowser控件。它通常有效,但有時會在用戶提交表單後在網站上引發一些錯誤。但在IE中,這個錯誤不會引發相同的數據。
有什麼方法可以直接在IE中導航和填充表單並顯示給用戶? (這個站點有很多客戶端控件,我必須等待才能響應我的數據(例如,在選擇狀態後加載城市)
我想導航一個網站,通過我的應用程序登錄並填寫一個表單,而不會看到任何用戶,最後顯示給用戶提交。處理IE填寫表單c#
以前我使用過webbrowser控件。它通常有效,但有時會在用戶提交表單後在網站上引發一些錯誤。但在IE中,這個錯誤不會引發相同的數據。
有什麼方法可以直接在IE中導航和填充表單並顯示給用戶? (這個站點有很多客戶端控件,我必須等待才能響應我的數據(例如,在選擇狀態後加載城市)
您可以從C#應用程序自動化Internet Explorer實例首先,創建interop裝配SHDocVw.dll
與TlbImp.exe ieframe.dll
,並將其添加爲你的項目的引用然後使用下面的代碼創建一個IE進程外實例:
var ie = (SHDocVw.WebBrowser)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application"));
ie.Visible = true;
ie.Navigate("http://www.example.com");
用它在你使用WebBrowser
控制類似的方式。
這就是說,我相信你仍然可以使用hoste d WebBrowser
爲了實現目標,只需實現feature control,以使它的行爲與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");
}
}
}
這裏有一個[相關答案】(http://stackoverflow.com/a/18546866/1768303)如何進入IE瀏覽器的DOM對象失PROC。 – Noseratio