我正在尝试使用以下代码处理身份验证弹出窗口:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.http.phishy-userpass-length", 255);
profile.setPreference("network.automatic-ntlm-auth.trusted-uris", "x.x.x.x");
driver = new FirefoxDriver(profile);
baseUrl="http://" + login + ":" + password + "@" + url;
driver.get(baseUrl + "/");


执行测试时,页面显示身份验证弹出窗口,并且仍会加载a,直到单击为止取消按钮。那一刻,我可以访问下一页,这意味着身份验证成功,但仍然始终显示身份验证弹出窗口

评论

选中此选项可处理警报/弹出窗口stackoverflow.com/questions/17066382/…

我检查了很多替代方法,但没有用

哪些替代方法,请更具体。

我尝试使用具有和不具有Firefox Profile的login:password @ url进行身份验证///此外,我尝试使用''____String window1 = driver.getWindowHandle(); driver.findElement(By.cssSelector(“ input”))。sendKeys(login); _____''///和我尝试使用driver.switchTo()。alert()//来访问弹出窗口正常工作//始终将测试卡在加载地址中,并在屏幕上弹出窗口

应该更新此问题,以注意所显示的身份验证弹出窗口的类型。由于标记的解决方案不适用于所需的浏览器身份验证,因此弹出。

#1 楼

警报方法authenticateUsing()可让您跳过Http基本身份验证框。

WebDriverWait wait = new WebDriverWait(driver, 10);      
Alert alert = wait.until(ExpectedConditions.alertIsPresent());     
alert.authenticateUsing(new UserAndPassword(username, password));



从Selenium 3.4开始,它仍处于beta版本

现在仅对InternetExplorerDriver执行实施


评论


凉!请注意,此刻它仍然标记有“ @Beta”标记selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/…

– SirLenz0rlot
2014-12-15 10:55

嗯,在最新的Chrome浏览器中,基本身份验证登录弹出窗口似乎没有被视为“警告”

– SirLenz0rlot
2015年1月7日在15:38

是的,可能仅仅是因为我在使用ChromeDriver吗?

– SirLenz0rlot
2015年1月8日10:00

这似乎没有在.NET中实现:(

– Benjrb
15年2月13日在13:55

被删除了github.com/SeleniumHQ/selenium/commits/master/java/client/src / ...

– Bhabani Sankar Mishra
17年11月21日在5:41

#2 楼

不要使用firefox配置文件,并尝试以下代码:

driver.get("http://UserName:Password@Example.com");


如果要在IE浏览器中实现它,则需要执行某些操作。

如果您的身份验证服务器要求使用具有“ domainuser”之类的域的用户名,则需要在URL中添加双斜杠/

//localdomain\user:password@example.com


评论


@Imen:尝试在网址末尾添加一个/(请参阅我的答案)

–拉尔夫
2014年10月9日13:30

您也可以使用driver.Navigate()。GoToUrl(“ http:// UserName:Password@Example.com”)。这对我有用

–金发先生
2015年9月2日,11:12



那么如果我的密码中有@符号,该怎么办。因为我的密码中有@符号。

– Badp
16年6月8日在14:19

在这种情况下,@ badp仅用密码%40替换@。它是网址编码。

– Artem G
17 Mar 24 '17在10:30

这在普通浏览器或Selenium驱动的浏览器中均不起作用。

–塞林
18年4月26日在20:43

#3 楼

尝试以下解决方案,并在遇到任何问题时通知我:

driver.get('https://example.com/')
driver.switchTo().alert().sendKeys("username" + Keys.TAB + "password");
driver.switchTo().alert().accept();


这对我来说很好工作

评论


那就是对我有用的那个。显示UI时有点不可靠(可能是由于i3wm如何处理焦点),但是在无头的情况下效果很好。

–冈萨格
18-10-25在9:48



#4 楼

我在应用程序中多次遇到此问题。

我们通常可以通过以下两种方法来解决此问题。


在url中传递用户名和密码本身
您可以在打开url之前创建一个AutoIT脚本并调用脚本。

请检查下面我同时提到的两种方法:Selenium Webdriver中的Handle Authentication / Login窗口

评论


AutoIt是一种原始的耻辱。 Selenium Driver为什么不实现此重要功能?

– Elmue
17年5月16日在17:38



我之前做过完全相同的方法,两者都很好。如果正确编写命令,AutoIT是非常可靠的工具,它非常稳定。

– ibaralf
18-10-24在22:20

#5 楼

通过使用AutoAuth插件,这应该适用于Firefox:

FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default");
File ffPluginAutoAuth = new File("D:\autoauth-2.1-fx+fn.xpi");
firefoxProfile.addExtension(ffPluginAutoAuth);
driver = new FirefoxDriver(firefoxProfile);


#6 楼

如果必须处理NTLM代理身份验证,一个不错的选择是使用通过CNTLM配置本地代理。

凭据和域在/etc/cntlm.conf中配置。

之后,您可以使用自己的代理来处理所有NTLM内容。

DesiredCapabilities capabilities = DesiredCapabilities.chrome();

Proxy proxy = new Proxy();
proxy.setHttpProxy("localhost:3128");
capabilities.setCapability(CapabilityType.PROXY, proxy);

driver = new ChromeDriver(capabilities);


评论


如我所读,CNTLM不适用于HTTPS。这对我来说完全没有用。 sourceforge.net/p/cntlm/support-requests/14。除此之外,CNTLM是一个死项目。自2012年以来,错误报告一直没有答案。

– Elmue
17年5月16日在18:34



#7 楼

流行的解决方案是在URL中添加用户名和密码,例如http:// username:password@website.com。但是,如果您的用户名或密码包含特殊字符,则可能会失败。因此,在创建URL时,请确保对这些特殊字符进行编码。

String username = URLEncoder.encode(user, StandardCharsets.UTF_8.toString());
String password = URLEncoder.encode(pass, StandardCharsets.UTF_8.toString());
String url = “http://“ + username + “:” + password + “@website.com”;
driver.get(url);