Como posso executar testes do Internet Explorer Selenium como um usuário de domínio específico?

Eu tenho um site ASP.NET MVC que usa a autenticação do Windows para controlar o acesso. Eu gostaria de ter um teste de selênio de fluxo de especificação que verifique se a configuração está correta, tentando visitar o site como um usuário não autorizado.

Como estamos usando contas de domínio para controlar o acesso, não há uma tela de login de nome de usuário / senha. As credenciais do usuário atual são automaticamente passadas para o site pelo navegador.

Portanto, para o teste do Selenium, preciso executar o Internet Explorer como um usuário específico.

Encontrei vários artigos sobre a representação do Windows e posso mudar para o meu usuário de teste durante a execução do teste (usando o código dehttp://support.microsoft.com/kb/306158) No entanto, se eu criar um InternetExplorerDriver, ele iniciará o Internet Explorer com minhas credenciais, e não com o usuário de teste (embora esta pergunta e resposta sugira que ele funcionehttps://sqa.stackexchange.com/questions/2277/using-selenium-webdriver-with-windows-authentication)

Também posso iniciar explicitamente um processo do Internet Explorer como meu usuário de teste, mas não consigo encontrar uma maneira de vincular um InternetExplorerDriver a um processo do Internet Explorer já em execução, portanto, esse pode ser um beco sem saída.

Meu código, basicamente retirado da página do MSDN acima, está abaixo. No depurador, vejo que WindowsIdentity.GetCurrent (). Name é "testUser" em todas as etapas do teste.

namespace MyProject.Specs
{
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using TechTalk.SpecFlow;

[Binding]
public class AuthorisationSteps
{
    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;
    private static WindowsImpersonationContext impersonationContext;
    private static IWebDriver driver;

    [BeforeScenario]
    public static void impersonateUser()
    {
        if (!impersonateValidUser("testUser", "testDomain", "password"))
        {
            throw new Exception();
        }
        driver = new InternetExplorerDriver();
    }

    [AfterScenario]
    public static void cleanupUser()
    {
        undoImpersonation();
        driver.Quit();
    }

    [Given(@"I am an unauthorised user")]
    public void GivenIAmAnUnauthorisedUser()
    {
        var temp = WindowsIdentity.GetCurrent().Name;
    }

    [When(@"I go to the home page")]
    public void WhenIGoToTheHomePage()
    {
        var temp = WindowsIdentity.GetCurrent().Name;
        driver.Navigate().GoToUrl(BaseUrl);
    }

    [Then(@"I should see an error page")]
    public void ThenIShouldSeeAnErrorPage()
    {
        var temp = WindowsIdentity.GetCurrent().Name;
        Assert.That(driver.Title.Contains("Error"));
    }

    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
                                        String lpszDomain,
                                        String lpszPassword,
                                        int dwLogonType,
                                        int dwLogonProvider,
                                        ref IntPtr phToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
                                            int impersonationLevel,
                                            ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern bool CloseHandle(IntPtr handle);

    private static bool impersonateValidUser(String userName, String domain, String password)
    {
        WindowsIdentity tempWindowsIdentity;
        var token = IntPtr.Zero;
        var tokenDuplicate = IntPtr.Zero;

        if (RevertToSelf())
        {
            if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
                LOGON32_PROVIDER_DEFAULT, ref token) != 0)
            {
                if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                {
                    tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                    impersonationContext = tempWindowsIdentity.Impersonate();
                    if (impersonationContext != null)
                    {
                        CloseHandle(token);
                        CloseHandle(tokenDuplicate);
                        return true;
                    }
                }
            }
        }
        if (token != IntPtr.Zero)
        {
            CloseHandle(token);
        }
        if (tokenDuplicate != IntPtr.Zero)
        {
            CloseHandle(tokenDuplicate);
        }
        return false;
    }

    private static void undoImpersonation()
    {
        impersonationContext.Undo();
    }
}

}

questionAnswers(8)

yourAnswerToTheQuestion