是否有一种方法可以提供这些凭据,仍然允许我在所有环境中运行测试主要浏览器?
#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)
评论
这里有一个答案可能会有所帮助:stackoverflow.com/questions/5672407/…我尝试过一个,但是它仅适用于基本身份验证。我需要Windows集成身份验证。
请参阅我的回复[使用Selenium和Java线程的Windows身份验证] [1]。 [1]:stackoverflow.com/questions/11522434 / ...