Andy
Andy

Reputation: 383

C# IE11 Automation - Cannot Connect To Open IE Window

I'm trying to connect to an Internet Explorer window that is already open. Once connected I need to send some keystrokes (via SendKeys) to the IE window for some processing. I've got the following code below that works up until the SendKeys command. It finds the IE window titled "Graphics Database". When it hits "SendKeys.Send("{TAB}");" I get the error "An unhandled exception of type 'System.NullReferenceException' occurred".

Additional information: I also get the following on the NullReferenceException error. The weird thing is if I code to open a new IE window and then use SendKeys it works fine. Connecting to an existing windows seems to cause this issue.

SendKeys cannot run inside this application because the application is not handling Windows messages. Either change the application to handle messages, or use the SendKeys.SendWait method.

Can anyone please help me figure out what to do to fix this?

Andy

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}");

Upvotes: 2

Views: 1858

Answers (2)

JMIII
JMIII

Reputation: 404

Andy please bear with me as this will be long. First you are going to want to look mshtml documentation and Dom. https://msdn.microsoft.com/en-us/library/aa741314(v=vs.85).aspx I don't know why automation is so convoluted but it is. The UIautomation class works great for windows apps but has nothing really for IE that I've been able to find. Others will point to third parties like waitn and selenium. Waitn appears to no longer be supported and selenium won't let you grab an open IE browser. I have gone down this path recently because I wanted to be able to create an app to store my web passwords and auto fill them in since I can't save my username and passwords in browser due to security restrictions. I have an example here and hope it helps. First open up IE and navigate to http://aavtrain.com/index.asp. Then have a console project with mshtml referenced and shdocvw. Here is code below. It gets the window then finds elements for username, password, and submit. then populates the username and password and clicks the submit button. I don't have a login to this site so it won't log you in. I have been using it for my testing. Problem I have is sites with javascript login forms. If you get further with this info please post back as I am still trying to evolve the concepts and create something reusable.

        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");

Upvotes: 0

Andy
Andy

Reputation: 383

I was able to resolve this issue. I could never get the IE.Visible = true to work. This seemed to do nothing in my code. I had to use the SetForegroundWindow() to set the focus to the IE window.

// 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);

This site helped me immensely with getting the SetForegroundWindow() working.

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

Upvotes: 2

Related Questions