如何使用Selenium WebDriver处理登录弹出窗口?

时间:2012-07-17 12:28:11

标签: selenium-webdriver popup alert

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

谢谢&问候,  enter image description here

16 个答案:

答案 0 :(得分:35)

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

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

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

无需任何调整即可适用于我。

示例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...
}

答案 1 :(得分:8)

这适用于Windows Server 2012和IE。

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

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

alert.Accept();

答案 2 :(得分:4)

解决方案:使用线程和机器人进行Windows活动目录身份验证

我使用Java Thread and Robot和Selenium webdriver来自动化我们网站的Windows Active Directory身份验证过程。 这种逻辑在Firefox和Chrome中运行良好,但它在IE中不起作用。出于某种原因,IE会在弹出身份验证窗口时杀死webdriver,而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);
        }                        
    }      
}

答案 3 :(得分:3)

这在WebDriver 3.0中非常简单(截至目前已在Beta版中)。

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

希望这有帮助。

答案 4 :(得分:2)

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

示例:

Java 示例:

config/filesystems.php

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

中有修复可用

答案 5 :(得分:1)

我的用例是:

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

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

仅在 URL 中提供 username:password 不会从上面的第 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());

答案 6 :(得分:0)

以下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();

答案 7 :(得分:0)

我使用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);
        }
}

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

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

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

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

答案 12 :(得分:0)

在C#Selenium Web驱动程序中,我设法使它与以下代码一起使用:

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 did   与已知命令不匹配”

答案 13 :(得分:0)

处理身份验证弹出窗口的最简单方法是在“网址本身”中输入凭据。例如,我有Username: adminPassword: admin之类的凭据:

WebDriver driver = new ChromeDriver();
driver.get("https://admin:admin@your website url");

答案 14 :(得分:-1)

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

WinWaitActive("Authentication Required","","10")
If WinExists("Authentication Required") Then
Send("username{TAB}")
Send("Password{Enter}")
EndIf'

答案 15 :(得分:-1)

最好选择Autoit工具来处理所有Windows活动。您可以使用AutoIt工具制作脚本来处理窗口任务,然后可以使用Selenium运行该exe。