我正在尝试为需要Windows身份验证的网站创建一些硒测试。我已经完成了我的第一个测试并相当轻松地运行了它,但是一旦系统提示输入凭据,它就会暂停。

是否有一种方法可以提供这些凭据,仍然允许我在所有环境中运行测试主要浏览器?

评论

这里有一个答案可能会有所帮助:stackoverflow.com/questions/5672407/…

我尝试过一个,但是它仅适用于基本身份验证。我需要Windows集成身份验证。

请参阅我的回复[使用Selenium和Java线程的Windows身份验证] [1]。 [1]:stackoverflow.com/questions/11522434 / ...

#1 楼

我最终为Firefox创建了一个自定义配置文件,并添加了AutoAuth插件。虽然不是特别优雅,但确实有效。归功于以下博客文章:

http://www.codemiller.com/post/5923640143/overcoming-auth-pop-ups

#2 楼

我发现WebDriver通过使用Windows Impersonation和IE的自动登录功能与IE 9和Windows / NTLM身份验证一起使用。在代码中。

基本上,您需要执行以下操作(确保将IE 9配置为“自动登录”):

impersonateValidUser("DifferentUser", "DOMAIN", "Password");
// WebDriver now logged in as "DifferentUser"
IWebDriver webDriver = new InternetExplorerDriver();


要恢复运行测试/ Selenium RC的用户,只需调用:

undoImpersonation();


评论


没有为我工作

– ColacX
15年2月12日在15:41

#3 楼

对于Firefox,此功能有效:
C#
var profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris", ".companyname.com");

return new FirefoxDriver(profile);

Python Python

评论


感谢你的回答。我让我的代码工作了。 Python:配置文件= {'network.automatic-ntlm-auth.trusted-uris':“ .companyname.com”},并将Browser('firefox',profile_preferences = profile)作为浏览器:browser.visit(url)

– wei
17年11月14日在6:19



#4 楼

模仿很棘手。我尚未使用Selenium完成此操作,但已使用WatiN和IE完成了此操作。我将发布可以与Selemium配合使用的WatiN解决方案(我认为)。

第一次启动,即使用System.Diagnostics.Process。启动IE后,您就可以使用此处的代码使用impersionation附加和与IE通讯了。

这是代码

    [TestMethod]
    public void TestMethod()
    {
        SecureString password = new SecureString();
        password.AppendChar('p');
        password.AppendChar('a');
        password.AppendChar('s');
        password.AppendChar('s');
        password.AppendChar('w');
        password.AppendChar('o');
        password.AppendChar('r');
        password.AppendChar('d');

        ProcessStartInfo psi = new ProcessStartInfo();
        psi.UserName = "localtest";
        psi.Password = password;
        psi.UseShellExecute = false;
        psi.LoadUserProfile = true;
        psi.FileName = "c:\Program Files\Internet Explorer\iexplore.exe";
        psi.Arguments = "about:blank";

        Process proc = new Process();
        proc.StartInfo = psi;
        proc.Start();

        t.Join();

        proc.Kill(); 
    }

    private static void DoWorkAs(object o)
    {
        User u = o as User;


        IntPtr hToken = IntPtr.Zero;
        IntPtr hTokenDuplicate = IntPtr.Zero;

        if (Win32.LogonUser(u.UserName, u.Domain, u.Password, 2 /*LOGON32_LOGON_INTERACTIVE*/, 0 /*LOGON32_PROVIDER_DEFAULT*/, out hToken))
        {
            if (Win32.DuplicateToken(hToken, 2, out hTokenDuplicate))
            {
                WindowsIdentity windowsIdentity = new WindowsIdentity(hTokenDuplicate);
                WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();

                // domain\username
                Console.WriteLine(" Thread 2 : " + WindowsIdentity.GetCurrent().Name);


                // This is WatiN code, you will need to replace with Selenium
                IE ie = IE.AttachToIE(Find.ByUrl("about:blank"));

                ie.GoTo(@"http://www.google.com/");
                ie.TextField(Find.ByName("q")).TypeText("WatiN");
                ie.Button(Find.ByName("btnG")).Click();

                Assert.IsTrue(ie.ContainsText("WatiN"));
                ie.GoTo("about:blank");

                //revert
                impersonationContext.Undo();
                Console.WriteLine(WindowsIdentity.GetCurrent().Name);
            }
        }
        if (hToken != IntPtr.Zero) Win32.CloseHandle(hToken);
        if (hTokenDuplicate != IntPtr.Zero) Win32.CloseHandle(hTokenDuplicate);
    }

    public class User
    {
        public User(string u, string d, string p)
        {
            Domain = d;
            UserName = u;
            Password = p;
        }
        public string UserName;
        public string Domain;
        public string Password;
    }
    public class Win32
    {
        // P/Invoke snask
        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool LogonUser(
            string lpszUsername,
            string lpszDomain,
            string lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            out IntPtr phToken);

        [DllImport("advapi32.dll", SetLastError = true)]
        public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int
           SECURITY_IMPERSONATION_LEVEL, out IntPtr DuplicateTokenHandle);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool CloseHandle(IntPtr hHandle);

    }


此代码需要重构,由于IE8中已修复了IE错误,因此无法在带有IE7的Vista上运行。

#5 楼

有两种方法可以实现此目的:


您可以直接在url中传递凭据,这样它将跳过身份验证窗口。
您还可以使用AutoIT来帮助您实现在您的测试中也是如此。

这里的文章将为您提供指导:

http://learn-automation.com/handle-windows-authentication-using-selenium- webdriver /

#6 楼

我用作跨OS和浏览器使用的解决方案的是MITM代理。请参阅https://github.com/rac2030/CAPS,它允许您自行设置SSL上下文,从而使您可以自由使用任何想要收集该上下文的方法(我将其用于使用智能卡的基于Entrust的身份验证,测试证书存储库),但通常会坚持使用客户端证书,因为它可以跨操作系统(尤其是从我们的CI设置中使用)。

#7 楼

Java对webdriver的支持相当粗糙,因此这里是Javascript中的一个示例,以防万一您和我一样,需要花另外半小时的时间来仔细阅读文档以在JS中找到正确的方法名称:

let profile = new firefox.Profile();
profile.setPreference('network.automatic-ntlm-auth.trusted-uris', '.company.com')
let options = new firefox.Options().setProfile(profile);

let driver = new webdriver.Builder().
    usingServer('http://localhost:4444/wd/hub').
    withCapabilities(webdriver.Capabilities.firefox()).
    setFirefoxOptions(options).
    build();


(显然是ES6;如果您在Node <4上,请将let的所有实例更改为var

评论


除了已登录的用户,是否可以通过凭证?

–多态
17年1月11日在12:52

@MohammadaminKhayat我不知道。现在,您正在谈论欺骗Windows以确认您不是自己的用户,这将需要比我目前拥有的更多有关Windows方面的知识。您可能需要重新考虑一些策略

– Yamikuronue
17年1月16日在14:39

我正在尝试测试由具有不同角色的多个用户完成的方案。因此,我必须更改每个浏览器实例的用户凭据。因为该Web应用程序正在使用Windows身份验证。

–多态
17年1月16日在14:45

@MohammadaminKhayat是否可以在测试的设置阶段设置角色?因此,在运行测试之前,您要更改正在运行的用户的角色吗?

– Yamikuronue
17年1月16日在14:48

更改用户角色还不够现实。就我而言,不同的用户实际上对数据和方案有自己的影响。例如,对于记录的创建者和记录的编辑者(用户本身,而不是角色)会有些担心。因此,为了进行良好的端到端测试,最好接近现实。

–多态
17年1月16日在15:22

#8 楼

我将Java Thread和Robot与Selenium结合使用来自动执行Windows Active Directory身份验证。您可以在此处使用Selenium和Java Thread进行Windows身份验证。

评论


首先,对于这么古老的问题,您的答案没有任何价值。其次,您从SE提出的解决方案实际上并不能回答OP的问题,这是一种适用于所有主要浏览器的解决方案。

–凯特·保罗(Kate Paulk)
15年5月6日在11:39

#9 楼




我正在使用它,它正在为我工​​作。它解析URL,然后在其中输入用户名和密码,这样我就可以通过URL进行身份验证。

public void login(String username, String password){
        WebDriver driver = getDriver();
        String URL = "http://" + username + ":" + password + "@" + "link";
        driver.get(URL);
        driver.manage().window().maximize();
    }


评论


这不适用于所有浏览器。例如,Firefox显示一个警告弹出窗口,您必须处理它。除此之外,在URL中传输密码也不明智。这是安全隐患

– Elmue
17年5月13日在14:51



#10 楼

这并不是OP所要求的,它是对具有AD身份验证的站点的IE和Edge测试的替代方案;只需停止显示浏览器提示,而仅使用运行浏览器的用户的AD凭据即可。

如果您要针对Edge或IE测试您的站点,并且该站点使用AD身份验证,则两个浏览器会提示您的用户凭据,如针对Firefox和Chrome所述。

只需将站点添加到Intranet区域站点的测试计算机列表中,就可以使两个浏览器静默地接受运行该浏览器的用户的AD凭据。

#11 楼

基于Marc Lopez和Rohit的回答。我的代码正常工作。

Python:

from splinter import Browser

profile = {'network.automatic-ntlm-auth.trusted-uris': ".companyname.com"}

with Browser('firefox', profile_preferences=profile) as browser:
browser.visit(url)


#12 楼

请使用这个。我已经对此进行了检查,并且效果很好。