C#IE11自动化 - 无法连接到打开IE窗口

时间:2017-07-17 20:35:44

标签: c# automation internet-explorer-11

我正在尝试连接已经打开的Internet Explorer窗口。连接后,我需要将一些击键(通过SendKeys)发送到IE窗口进行一些处理。我有以下代码,直到SendKeys命令。它找到标题为“图形数据库”的IE窗口。当它命中“SendKeys.Send(”{TAB}“);”我收到错误“发生了'System.NullReferenceException'类型的未处理异常”。

其他信息:我还在NullReferenceException错误上获得以下内容。奇怪的是,如果我编码打开一个新的IE窗口然后使用SendKeys它工作正常。连接到现有的窗口似乎会导致此问题。

SendKeys无法在此应用程序内运行,因为应用程序未处理Windows消息。更改应用程序以处理消息,或使用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}");

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

安迪请耐心等待,因为这将是漫长的。首先,您将要查看mshtml文档和Dom。 https://msdn.microsoft.com/en-us/library/aa741314(v=vs.85).aspx我不知道为什么自动化如此错综复杂但事实如此。 UIautomation类适用于Windows应用程序,但对于我能够找到的IE没有任何帮助。其他人会指向第三方,如waitn和selenium。似乎不再支持Waitn,并且selenium不会让你抓住一个开放的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");