38

如何使用 Selenium Webdriver 处理登录弹出窗口?我在此处附上了示例屏幕。如何在此登录弹出/警报窗口中输入/输入用户名和密码?

感谢和问候, 在此处输入图像描述

4

16 回答 16

41

使用在 URL 请求中发送用户名和密码的方法:

http://username:password@the-site.com

所以只是为了让它更清楚。用户名是username密码password,其余的是测试网站的常用 URL

为我工作,无需任何调整。

示例 Java 代码:

public static final String TEST_ENVIRONMENT = "the-site.com";
private WebDriver driver;

public void login(String uname, String pwd){
  String URL = "http://" + uname + ":" + pwd + "@" + TEST_ENVIRONMENT;
  driver.get(URL);
}

@Test
public void testLogin(){
   driver = new FirefoxDriver();
   login("Pavel", "UltraSecretPassword");
   //Assert...
}
于 2012-07-17T12:46:35.677 回答
8

这应该适用于 windows server 2012 和 IE。

var alert = driver.SwitchTo().Alert();

alert.SetAuthenticationCredentials("username", "password");

alert.Accept();
于 2016-06-09T07:41:54.380 回答
5

这在 WebDriver 3.0 中非常简单(目前它是 Beta 版)。

Alert alert = driver.switchTo().alert() ;
alert.authenticateUsing(new UserAndPassword(_user_name,_password));
driver.switchTo().defaultContent() ; 

希望这会有所帮助。

于 2016-08-10T09:38:15.250 回答
4

现在在 2020 年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 中有一个错误,它会发送用户名/密码的用户名。需要等待硒版本的下一个版本,因为主干中提供了修复https://github.com/SeleniumHQ/selenium/commit/4917444886ba16a033a81a2a9676c9267c472894

于 2020-12-31T06:43:34.883 回答
3

解决方案:使用 Thread 和 Robot 的 Windows 活动目录身份验证

我使用 Java Thread 和 Robot 和 Selenium webdriver 来自动化我们网站的 Windows 活动目录身份验证过程。此逻辑在 Firefox 和 Chrome 中运行良好,但在 IE 中不起作用。出于某种原因,当身份验证窗口弹出时,IE 会终止 Web 驱动程序,而 Chrome 和 Firefox 会阻止 Web 驱动程序被终止。我没有尝试使用其他网络浏览器,例如 Safari。

//...
//Note: this logic works in Chrome and Firefox. It did not work in IE and I did not try Safari.
//...

//import relevant packages here

public class TestDemo {

    static WebDriver driver;

    public static void main(String[] args) {

        //setup web driver
        System.setProperty("webdriver.chrome.driver", "path to your chromedriver.exe");
        driver = new ChromeDriver();

        //create new thread for interaction with windows authentication window
        (new Thread(new LoginWindow())).start();                

        //open your url. this will prompt you for windows authentication
        driver.get("your url");

        //add test scripts below ...
        driver.findElement(By.linkText("Home")).click();    
        //.....
        //.....
    }

    //inner class for Login thread    
    public class LoginWindow implements Runnable {

        @Override
        public void run() {
            try {
                login();
            } catch (Exception ex) {
                System.out.println("Error in Login Thread: " + ex.getMessage());
            }
        }

        public void login() throws Exception {

            //wait - increase this wait period if required
            Thread.sleep(5000);

            //create robot for keyboard operations
            Robot rb = new Robot();

            //Enter user name by ctrl-v
            StringSelection username = new StringSelection("username");
            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(username, null);            
            rb.keyPress(KeyEvent.VK_CONTROL);
            rb.keyPress(KeyEvent.VK_V);
            rb.keyRelease(KeyEvent.VK_V);
            rb.keyRelease(KeyEvent.VK_CONTROL);

            //tab to password entry field
            rb.keyPress(KeyEvent.VK_TAB);
            rb.keyRelease(KeyEvent.VK_TAB);
            Thread.sleep(2000);

            //Enter password by ctrl-v
            StringSelection pwd = new StringSelection("password");
            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(pwd, null);
            rb.keyPress(KeyEvent.VK_CONTROL);
            rb.keyPress(KeyEvent.VK_V);
            rb.keyRelease(KeyEvent.VK_V);
            rb.keyRelease(KeyEvent.VK_CONTROL);

            //press enter
            rb.keyPress(KeyEvent.VK_ENTER);
            rb.keyRelease(KeyEvent.VK_ENTER);

            //wait
            Thread.sleep(5000);
        }                        
    }      
}
于 2015-05-06T05:04:32.830 回答
3

处理身份验证弹出窗口的最简单方法是在 Url 本身中输入凭据。例如,我有像Username: admin和这样的凭证Password: admin

WebDriver driver = new ChromeDriver();
driver.get("https://admin:admin@your website url");
于 2019-03-22T05:40:11.793 回答
2

这是基于 Python 的 selenium 的解决方案,经过源代码(此处)。我发现这 3 个步骤很有用。

obj = driver.switch_to.alert
obj.send_keys(keysToSend="username\ue004password")
obj.accept()

这里 \ue004 是 TAB 的值,您可以在源代码的 Keys 类中找到它。

我想同样的方法也可以在 JAVA 中使用,但不确定。

于 2018-12-03T10:51:24.973 回答
1

我的用例是:

  1. 导航到 web 应用程序。
  2. Webapp 检测到我没有登录,并重定向到 SSO 站点 - 不同的服务器!
  3. SSO 站点(可能在 Jenkins 上)检测到我未登录 AD,并显示登录弹出窗口。
  4. 输入凭据后,您将被重定向回 webapp。

我使用的是 Selenium 3 的更高版本,并且未检测到登录弹出窗口driver.switchTo().alert();- 结果为NoAlertPresentException.

username:password在 URL 中提供不会从上面的第 1 步传播到第 2 步。

我的解决方法:

import org.apache.http.client.utils.URIBuilder;

driver.get(...webapp_location...);
wait.until(ExpectedConditions.urlContains(...sso_server...));

URIBuilder uri = null;
try {
    uri = new URIBuilder(driver.getCurrentUrl());
} catch (URISyntaxException ex) {
    ex.printStackTrace();
}
uri.setUserInfo(username, password);
driver.navigate().to(uri.toString());
于 2021-01-22T21:02:34.640 回答
0

您可以使用此 Autoit 脚本来处理登录弹出窗口:

WinWaitActive("Authentication Required","","10")
If WinExists("Authentication Required") Then
Send("username{TAB}")
Send("Password{Enter}")
EndIf'
于 2013-01-30T11:56:55.453 回答
0

每当我的应用程序打开时,我都会收到 Windows 安全警报。为了解决这个问题,我使用了以下程序

import org.openqa.selenium.security.UserAndPassword;
UserAndPassword UP = new UserAndPassword("userName","Password");
driver.switchTo().alert().authenticateUsing(UP);

这解决了我登录应用程序的问题。我希望这可以帮助所有正在寻找身份验证 Windows 安全警报的人。

于 2017-02-08T20:52:21.447 回答
0

只需切换到警报并使用authenticateUsing设置用户名和密码,然后返回父窗口

Alert Windowalert = driver.switchTo().alert() ;
Windowalert.authenticateUsing(new UserAndPassword(_user_name,_password));
driver.switchTo().defaultContent() ; 
于 2017-09-27T09:31:54.603 回答
0

弹出窗口的类型在 webdriver 警报中定义:https ://www.selenium.dev/documentation/webdriver/browser/alerts/

这是另一种类型 - 身份验证弹出窗口 - 例如由 Weblogic 生成而 Selenium 看不到。

作为 HTTPS,用户/密码不能直接放在 URL 中。

解决方案是创建一个浏览器扩展:打包或解包。

这是解包和打包过程的代码:https ://qatestautomation.com/2019/11/11/handle-authentication-popup-in-chrome-with-selenium-webdriver-using-java/

在 manifest.json 中而不是“https://ReplaceYourCompanyUrl” 中放置“<all_urls>”。解压后可以直接在 Selenium 中使用:

#python:
co=webdriver.ChromeOptions()
co.add_argument("load-extension=ExtensionFolder")

<all_urls> 是匹配模式

请求流程在https://developer.chrome.com/docs/extensions/reference/webRequest/

于 2022-02-15T13:59:15.510 回答
0

在 C# Selenium Web Driver 中,我设法让它使用以下代码:

var alert = TestDriver.SwitchTo().Alert();
alert.SendKeys(CurrentTestingConfiguration.Configuration.BasicAuthUser + Keys.Tab + CurrentTestingConfiguration.Configuration.BasicAuthPassword);
alert.Accept();

虽然看起来很相似,但以下内容不适用于 Firefox(Keys.Tab 重置所有表单,密码将写入用户字段中):

alert.SendKeys(CurrentTestingConfiguration.Configuration.BasicAuthUser);
alert.SendKeys(Keys.Tab);
alert.SendKeys(CurrentTestingConfiguration.Configuration.BasicAuthPassword);

另外,我尝试了以下导致异常的解决方案:

var alert = TestDriver.SwitchTo().Alert();
alert.SetAuthenticationCredentials(
   CurrentTestingConfiguration.Configuration.BasicAuthUser,
   CurrentTestingConfiguration.Configuration.BasicAuthPassword);

System.NotImplementedException:'POST /session/38146c7c-cd1a-42d8-9aa7-1ac6837e64f6/alert/credentials 与已知命令不匹配'

于 2019-01-09T08:14:12.783 回答
0

处理此问题的一种方法是您可以使用 url 提供登录详细信息。例如,如果您的 url 是“ http://localhost:4040 ”并且它在警报提示消息中询问“用户名”和“密码”,那么您可以将 baseurl 作为“ http://username:password@localhost:4040 ”传递。希望它有效

于 2018-08-02T09:28:33.750 回答
-1

以下 Selenium-Webdriver Java 代码应该可以很好地处理警报/弹出窗口:

driver.switchTo().alert();
//Selenium-WebDriver Java Code for entering Username & Password as below:
driver.findElement(By.id("userID")).sendKeys("userName");
driver.findElement(By.id("password")).sendKeys("myPassword");
driver.switchTo().alert().accept();
driver.switchTo().defaultContent();
于 2013-03-27T07:03:28.847 回答
-1

我使用 IE,然后创建这样的代码并在修改几个代码后工作:

       public class TestIEBrowser {
                          public static void main(String[] args) throws Exception {
               //Set path of IEDriverServer.exe.
              // Note : IEDriverServer.exe should be In D: drive.
              System.setProperty("webdriver.ie.driver", "path /IEDriverServer.exe");

              // Initialize InternetExplorerDriver Instance.
              WebDriver driver = new InternetExplorerDriver();

              // Load sample calc test URL.
              driver.get("http://...  /");

              //Code to handle Basic Browser Authentication in Selenium.
              Alert aa = driver.switchTo().alert();

              Robot a = new Robot();
              aa.sendKeys("host"+"\\"+"user");  

              a.keyPress(KeyEvent.VK_TAB);
              a.keyRelease(KeyEvent.VK_TAB);
              a.keyRelease(KeyEvent.VK_ADD);                

              setClipboardData("password");

              a.keyPress(KeyEvent.VK_CONTROL);
              a.keyPress(KeyEvent.VK_V);
              a.keyRelease(KeyEvent.VK_V);
              a.keyRelease(KeyEvent.VK_CONTROL);
              //Thread.sleep(5000);
              aa.accept();        




    }

             private static void setClipboardData(String string) {
            // TODO Auto-generated method stub
                        StringSelection stringSelection = new StringSelection(string);                            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
        }
}
于 2016-08-24T04:43:25.543 回答