如何使用 Java 处理 Selenium WebDriver 的身份验证弹出窗口

Posted

技术标签:

【中文标题】如何使用 Java 处理 Selenium WebDriver 的身份验证弹出窗口【英文标题】:How to handle authentication popup with Selenium WebDriver using Java 【发布时间】:2014-08-09 21:10:43 【问题描述】:

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

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 + "/");

当我执行测试时,页面会显示身份验证弹出窗口,并且在我单击取消按钮之前仍在加载。那一刻,我可以访问下一页,这意味着认证成功但仍然总是显示认证弹出窗口

【问题讨论】:

选中此项以处理警报/弹出窗口***.com/questions/17066382/… 我检查了很多替代方案,但没有成功 哪些替代方案,请更具体。 我尝试使用 login:password@url 进行身份验证,无论是否使用 Firefox Profile/// 另外,我尝试使用 ''____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 仍处于测试阶段

目前仅针对InternetExplorerDriver完成实施

【讨论】:

酷!请注意,此时它仍然标有“@Beta”标签selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/… 嗯,在最新的 chrome 中,基本的身份验证登录弹出窗口似乎没有被视为“警报” 是的,可能仅仅是因为我使用的是 ChromeDriver 吗? 这似乎没有在 .NET 中实现 :( 被删除 github.com/SeleniumHQ/selenium/commits/master/java/client/src/…【参考方案2】:

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

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

如果您在 IE 浏览器中实现它,您需要做一些事情。

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

//localdomain\user:password@example.com

【讨论】:

@Imen:尝试在网址末尾添加/(见我的回答) 您也可以使用-driver.Navigate().GoToUrl("http://UserName:Password@Example.com")。这对我有用 那么如果我的密码中有一个@符号怎么办。因为我的密码中有一个@-sign。 @badp 在这种情况下,仅在密码中将 @ 替换为 %40。这是url编码。 这在普通浏览器或 Selenium 驱动的浏览器中都不起作用。【参考方案3】:

尝试以下解决方案,如有任何问题,请告诉我:

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

这对我来说很好用

【讨论】:

这对我有用。显示 UI 时有点不可靠(可能是由于 i3wm 处理焦点的方式),但它在无头模式下工作正常。【参考方案4】:

我在申请中多次遇到这个问题。

我们通常可以通过以下两种方法来处理这个问题。

    在 url 中传递用户名和密码

    您可以在打开 url 之前创建 AutoIT 脚本和调用脚本。

请查看下面我提到的两种方式的文章:Handle Authentication/Login window in Selenium Webdriver

【讨论】:

AutoIt 是一种原始的耻辱。为什么 Selenium Driver 没有实现这个重要功能? 我之前采用了完全相同的方法,而且效果都很好。如果您正确编写命令,AutoIT 是一个非常可靠的工具,它非常稳定。【参考方案5】:

这应该适用于 Firefox,使用 AutoAuth plugin:

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】:

流行的解决方案是在 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);

【讨论】:

【参考方案7】:

如果您必须处理 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 年以来,错误报告一直没有答案。【参考方案8】:

Selenium 4 支持使用 Basic 和 Digest auth 进行身份验证。它使用 CDP,目前仅支持 chromium 衍生的浏览器

Java 示例:

Webdriver driver = new ChromeDriver();

((HasAuthentication) driver).register(UsernameAndPassword.of("username", "pass"));

driver.get("http://sitewithauth");

注意:在 Alpha-7 中存在 错误,它会发送用户名/密码的用户名。需要等待 selenium 版本的下一个版本,因为主干https://github.com/SeleniumHQ/selenium/commit/4917444886ba16a033a81a2a9676c9267c472894中有修复程序@

【讨论】:

以上是关于如何使用 Java 处理 Selenium WebDriver 的身份验证弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium WebDriver、Java 通过文本选择 Web 元素

如何使用 javascript 使用 selenium Webdriver 使用 java 设置所选 Web 元素的属性?

如何使用 Selenium WebDriver 和 Java 处理日历弹出窗口?

如何使用带有 java 的 selenium Web 驱动程序从下拉菜单中选择一个元素?

如何使用 java 在 Selenium WebDriver 中处理 iframe

如何使用 Java 处理 Selenium WebDriver 的身份验证弹出窗口