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

时间:2014-06-19 10:47:54

标签: java authentication selenium selenium-webdriver popup

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

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

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

8 个答案:

答案 0 :(得分:40)

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

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

截至 Selenium 3.4 ,它仍处于测试阶段

     

现在只对InternetExplorerDriver

执行

答案 1 :(得分:29)

不要使用firefox个人资料并尝试以下代码:

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

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

如果您的身份验证服务器需要域名为" domainuser"您需要在网址中添加双斜杠/

//localdomain\user:password@example.com

答案 2 :(得分:7)

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

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

  1. 在网址中传递用户名和密码

  2. 您可以在打开网址之前创建AutoIT脚本并调用脚本。

  3. 请查看以下两种方式的文章:
    Handle Authentication/Login window in Selenium Webdriver

答案 3 :(得分:7)

尝试以下解决方案,如有任何问题,请与我联系:

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

这对我来说很好

答案 4 :(得分:3)

这应该适用于使用AutoAuth plugin

的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);

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

Java 示例:

print(sum(i['qty']*i['price'] for i in a if i['side'] == 'Buy')/len(list(i for i in a if i['side'] == 'Buy')))
print(sum(i['qty']*i['price'] for i in a if i['side'] == 'Sell')/len(list(i for i in a if i['side'] == 'Sell')))

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

中有修复可用

答案 7 :(得分:0)

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

<!DOCTYPE html><title>Title</title><style>body {width: 500px;}</style>
<script type="application/javascript">function $init() {return true;}</script><body><p checked class="title" id='title'>Title</p><!-- here goes the rest of the page --></body>