繁体   English   中英

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

[英]How to handle authentication popup with Selenium WebDriver using Java

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

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

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

警报方法authenticateUsing()允许您跳过Http Basic Authentication框。

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

Selenium 3.4 开始,它仍处于测试阶段

现在只为InternetExplorerDriver

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

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

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

如果您的身份验证服务器需要像“domainuser”这样的域的用户名,您需要在 url 中添加双斜杠/

//localdomain\user:password@example.com

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

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

这对我来说很好用

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

我们通常可以使用以下 2 种方法来处理此问题。

  1. 在 url 本身中传递用户名和密码

  2. 您可以在打开 url 之前创建一个 AutoIT 脚本并调用脚本。

请查看下面我提到的两种方式的文章:
在 Selenium Webdriver 中处理身份验证/登录窗口

这应该适用于使用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);

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

如果您必须处理 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);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM