2

我想導航一個網站,通過我的應用程序登錄並填寫一個表單,而不會看到任何用戶,最後顯示給用戶提交。處理IE填寫表單c#

以前我使用過webbrowser控件。它通常有效,但有時會在用戶提交表單後在網站上引發一些錯誤。但在IE中,這個錯誤不會引發相同的數據。

有什麼方法可以直接在IE中導航和填充表單並顯示給用戶? (這個站點有很多客戶端控件,我必須等待才能響應我的數據(例如,在選擇狀態後加載城市)

回答

2

您可以從C#應用程序自動化Internet Explorer實例首先,創建interop裝配SHDocVw.dllTlbImp.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.InvokeSynchronizationContext.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"); 
     } 

    } 
} 
+0

這裏有一個[相關答案】(http://stackoverflow.com/a/18546866/1768303)如何進入IE瀏覽器的DOM對象失PROC。 – Noseratio