2017-07-17 43 views
1

我試圖連接到已打開的Internet Explorer窗口。一旦連接,我需要發送一些擊鍵(通過SendKeys)到IE窗口進行一些處理。我有下面的代碼,直到SendKeys命令。它找到名爲「圖形數據庫」的IE窗口。當它擊中「SendKeys.Send(」{TAB}「);」我得到錯誤「一個未處理的類型'System.NullReferenceException'發生的異常」。C#IE11自動化 - 無法連接到打開IE窗口

附加信息:我還收到以下NullReferenceException錯誤。奇怪的是,如果我編碼打開一個新的IE窗口,然後使用SendKeys它工作正常。連接到現有的Windows似乎會導致此問題。

由於應用程序未處理Windows消息,因此SendKeys無法在此應用程序中運行。請將應用程序更改爲處理消息,或使用SendKeys.SendWait方法。

任何人都可以請幫我弄清楚該怎麼做才能解決這個問題?

安迪

InternetExplorer IE = null; 

// Get all browser objects 
ShellWindows allBrowsers = new ShellWindows(); 
if (allBrowsers.Count == 0) 
{ 
    throw new Exception("Cannot find IE"); 
} 

// Attach to IE program process 
foreach (InternetExplorer browser in allBrowsers) 
{       
    if (browser.LocationName == "Graphics Database") 
    { 
     MessageBox.Show ("Found IE browser '" + browser.LocationName + "'"); 
     IE = (InternetExplorer)browser; 
    } 
} 

IE.Visible = true; 
System.Threading.Thread.Sleep(2000); 

SendKeys.Send("{TAB}"); 
SendKeys.Send("G1007"); 
SendKeys.Send("{ENTER}"); 
+0

堆棧跟蹤或.... – hoodaticus

+0

我發現更多的問題是** IE.Visible = true; **不起作用。如果我在IE.Visible = true之前和之後用MessageBox暫停代碼並手動單擊圖形數據庫窗口使其處於活動狀態並在前面,則以下代碼將按預期工作。 – Andy

+0

我能解決這個問題。我永遠無法獲得IE.Visible = true的工作。這在我的代碼中似乎沒有任何意義。我不得不使用SetForegroundWindow()將焦點設置到IE窗口。 – Andy

回答

1

我能解決這個問題。我永遠無法獲得IE.Visible = true的工作。這似乎在我的代碼中什麼也沒做。我不得不使用SetForegroundWindow()將焦點設置到IE窗口。

// Find the IE window 
int hWnd = FindWindow(null, "Graphics Database - Internet Explorer"); 

if (hWnd > 0) // The IE window was found. 
{ 
    // Bring the IE window to the front. 
    SetForegroundWindow(hWnd); 

這個網站幫助我很大程度上得到了SetForegroundWindow()的工作。

http://forums.codeguru.com/showthread.php?460402-C-General-How-do-I-activate-an-external-Window

0

安迪請多多包涵,因爲這將是長期的。首先你要看看mshtml文檔和Dom。 https://msdn.microsoft.com/en-us/library/aa741314(v=vs.85).aspx我不知道爲什麼自動化是如此令人費解,但它是。 UIautomation類非常適用於windows應用程序,但對於我能找到的IE並沒有什麼特別的地方。其他人會指出像waitn和selenium這樣的第三方。 Waitn似乎不再支持,硒不會讓你抓住一個開放的IE瀏覽器。我最近走了這條路,因爲我想創建一個應用程序來存儲我的網絡密碼並自動填充它們,因爲由於安全限制,我無法在瀏覽器中保存我的用戶名和密碼。我在這裏有一個例子,希望它有幫助。首先打開IE並導航到http://aavtrain.com/index.asp。然後有一個帶有mshtml參考和shdocvw的控制檯項目。這是下面的代碼。它獲取窗口,然後找到用戶名,密碼和提交的元素。然後填充用戶名和密碼並單擊提交按鈕。我沒有登錄本網站,因此它不會登錄。我一直在使用它進行測試。我遇到的問題是使用JavaScript登錄表單的網站。如果您進一步瞭解這些信息,請回復,因爲我仍在嘗試發展概念並創建可重用的東西。

 SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); 

     Console.WriteLine("Starting Search\n\n\n"); 

     foreach (SHDocVw.InternetExplorer ie in shellWindows) 
     { 
      if (ie.LocationURL.Contains("aavtrain")) 
      { 
       Console.WriteLine(ie.LocationURL); 
       Console.WriteLine("\n\n\n\n"); 
       Console.WriteLine("FOUND!\n"); 

       mshtml.HTMLDocument document = ie.Document; 
       mshtml.IHTMLElementCollection elCol = document.getElementsByName("user_name"); 
       mshtml.IHTMLElementCollection elCol2 = document.getElementsByName("password"); 
       mshtml.IHTMLElementCollection elCol3 = document.getElementsByName("Submit"); 

       Console.WriteLine("AutofillPassword"); 


       foreach (mshtml.IHTMLInputElement i in elCol) 
       { 
        i.defaultValue = "John"; 
       } 

       foreach (mshtml.IHTMLInputElement i in elCol2) 
       { 
        i.defaultValue = "Password"; 
       } 

       Console.WriteLine("Will Click Button in 2 seconds"); 
       Thread.Sleep(2000); 

       foreach (mshtml.HTMLInputButtonElement i in elCol3) 
       { 

        i.click(); 
       } 


      } 
     } 

     Console.WriteLine("Finished");