Der Internet Explorer und seine Prozesse

Für die Browser-basierte UI-Testautomatisierung ist ein gewisses Grundverständnis der Browsertechnologie sinnvoll, daher hier eine kurze Einführung zur Prozessverwaltung des Internet Explorers.

Ab dem Internet Explorer 8 wurde ein neue neue Prozessverwaltung eingeführt. Microsoft nennt dieses Konzept Loosely-Coupled Internet Explorer (LCIE). Dies, weil der Crash einer Website in einem Tab nicht zum Crash des gesamten Browsers führen soll. Startet man also den Internet Explorer (es öffnet sich i.d.R. nur ein Tab) und schaut nach dessen Prozessen im Task Manager findet sich dort ein iexplore.exe und ein iexplore.exe *32. Der iexplore.exe ist der Hauptprozess, in dem der Frame (also das eigentliche rohe Fenster), die Favoritenleiste und die Adressleiste residieren. Der iexplore.exe *32 ist ein Prozess, in denen der Tab residiert. Öffnet man nun weitere Tabs, öffnen sich gg.falls weitere iexplore.exe *32-Prozesse. Wieviele Prozesse für die offenen Tabs geöffnet werden, entscheiden mehrere Faktoren (verfügbarer RAM, Zonenzugehörigkeit der geöffneten Websites, usw.)


Wer das Obige „erleben“ will, beendet einen iexplore.exe *32 per Taskmanager und schaut sich gleichzeitig die Tabs im Internet Explorer an. man sieht, dass kurze Zeit später ein neuer iexplore.exe *32 auftaucht und gleichzeitig im Browser die Webseite im entsprechenden Tab(s) neu geladen wird. Wer den iexplore.exe-Prozess beendet, schließt den Internet Explorer hingegen komplett.

Wer die entsprechenden Prozesse noch im Output des Visual Studios (New Project -> Console Project) mittels C# ausgeben möchte:

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;

class InternetExplorerChecker
{
    public static void Main()
    {
        Process[] allProcesses = Process.GetProcesses();
        foreach (Process process in allProcesses)
        {
            if (!process.ProcessName.Contains("iexplore")) continue;
            bool isProcess64Bit = ProcessBitnessChecker.Is64BitProcess(process);
            String processInfo = process.Id + ": " + process.ProcessName + " (isProcess64Bit: " + isProcess64Bit + ")";
            System.Diagnostics.Debug.WriteLine(processInfo);
        }
    }
}

static class ProcessBitnessChecker
{
    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool IsWow64Process([In] IntPtr processHandle, [Out, MarshalAs(UnmanagedType.Bool)] out bool wow64Process);

    public static bool Is64BitProcess(this Process process)
    {
        if (!Environment.Is64BitOperatingSystem)
            return false;

        bool isWow64Process;
        if (!IsWow64Process(process.Handle, out isWow64Process))
            throw new Win32Exception(Marshal.GetLastWin32Error());

        return !isWow64Process;
    }
}

Quelle des P/Invoke Snippets: http://stackoverflow.com/a/3576797/1777526