【问题标题】:How to handle authentication pop-up window in Selenium?如何处理 Selenium 中的身份验证弹出窗口?
【发布时间】:2016-05-11 11:58:12
【问题描述】:

请告诉我设置验证弹出窗口的用户名和密码的代码

System.setProperty("webdriver.chrome.driver","Driver//chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("http://admin3-dev.ca.primus");
WebDriverWait wait = new WebDriverWait(driver, 10);      


Alert alert = wait.until(ExpectedConditions.alertIsPresent());     
alert.authenticateUsing(new UserAndPassword("nsingh","Primus01"));

用户名和密码未通过上述代码的身份验证弹出窗口。请告诉我如何点击登录按钮。

【问题讨论】:

  • 如果是新窗口或 iframe,您可能需要切换到警报窗口。
  • 我已经使用机器人类处理了这种情况,运行脚本时请不要触摸鼠标和键盘。

标签: selenium selenium-webdriver


【解决方案1】:

我认为你必须使用机器人你可以添加这个类

class SmartRobot extends Robot {
 public SmartRobot() throws AWTException {
    super();
 }

public void pasteClipboard() {
    keyPress(KeyEvent.VK_CONTROL);
    keyPress(KeyEvent.VK_V);
    delay(50);
    keyRelease(KeyEvent.VK_V);
    keyRelease(KeyEvent.VK_CONTROL);
}

public void type(String text) {
    writeToClipboard(text);
    pasteClipboard();
}

private void writeToClipboard(String s) {
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    Transferable transferable = new StringSelection(s);
    clipboard.setContents(transferable, null);
}

}

在你的代码中改变这个

Alert alert = wait.until(ExpectedConditions.alertIsPresent());     
alert.authenticateUsing(new UserAndPassword("nsingh","Primus01"));

通过这个

driver.switchTo().alert();
SmartRobot robot = new SmartRobot();
robot.type(USERNAME);
robot.keyPress(KeyEvent.VK_TAB);
robot.type(PASSWORD);
robot.keyPress(KeyEvent.VK_ENTER);

【讨论】:

    【解决方案2】:

    您可以直接在 URL 本身中传递用户名和密码,如下所示:-

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

    参考以下链接:-

    http://www.seleniumeasy.com/selenium-tutorials/how-to-handle-authentication-popup-in-selenium-webdriver

    希望对你有帮助:)

    【讨论】:

    • 它不工作。请告诉我 FF 的其他选择。
    【解决方案3】:

    它在chrome 中工作,仍在寻找firefox 浏览器。

    System.setProperty("webdriver.chrome.driver","Driver//chromedriver.exe");
            driver=new ChromeDriver();
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            driver.manage().window().maximize();
            driver.get("http://admin3-dev.magma.ca");
    
    
           Robot rb  =new Robot();
           rb.keyPress(KeyEvent.VK_P);
           rb.keyRelease(KeyEvent.VK_P);
           rb.keyPress(KeyEvent.VK_C);
           rb.keyRelease(KeyEvent.VK_C);
           rb.keyPress(KeyEvent.VK_H);
           rb.keyRelease(KeyEvent.VK_H);
           rb.keyPress(KeyEvent.VK_A);
           rb.keyRelease(KeyEvent.VK_A);
           rb.keyPress(KeyEvent.VK_L);
           rb.keyRelease(KeyEvent.VK_L);
           rb.keyPress(KeyEvent.VK_L);
           rb.keyRelease(KeyEvent.VK_L);  
           rb.keyPress(KeyEvent.VK_A);
           rb.keyRelease(KeyEvent.VK_A);
    
           rb.keyPress(KeyEvent.VK_TAB);
           rb.keyRelease(KeyEvent.VK_TAB);
    
           rb.keyPress(KeyEvent.VK_CAPS_LOCK);
           rb.keyRelease(KeyEvent.VK_CAPS_LOCK);
           rb.keyPress(KeyEvent.VK_A);
           rb.keyRelease(KeyEvent.VK_A);
    
           rb.keyPress(KeyEvent.VK_CAPS_LOCK);
           rb.keyRelease(KeyEvent.VK_CAPS_LOCK);
           rb.keyPress(KeyEvent.VK_M);
           rb.keyRelease(KeyEvent.VK_M);
           rb.keyPress(KeyEvent.VK_M);
           rb.keyRelease(KeyEvent.VK_M);
           rb.keyPress(KeyEvent.VK_U);
           rb.keyRelease(KeyEvent.VK_U);
           rb.keyPress(KeyEvent.VK_L);
           rb.keyRelease(KeyEvent.VK_L);
           rb.keyPress(KeyEvent.VK_U);
           rb.keyRelease(KeyEvent.VK_U);
           rb.keyPress(KeyEvent.VK_1);
           rb.keyRelease(KeyEvent.VK_1);
           rb.keyPress(KeyEvent.VK_2);
           rb.keyRelease(KeyEvent.VK_2);
    
           rb.keyPress(KeyEvent.VK_TAB);
           rb.keyRelease(KeyEvent.VK_TAB);
           rb.keyPress(KeyEvent.VK_ENTER);`enter code here`
           rb.keyRelease(KeyEvent.VK_ENTER);
    

    【讨论】:

      【解决方案4】:

      我在项目中遇到了身份验证代理弹出问题。所以我尝试了下面的解决方案,它工作正常。 当我们在安全环境中从 Selenium Web 驱动程序运行脚本时,需要执行以下设置来处理身份验证代理。

      首先您需要了解以下详细信息,

      • network.proxy.autoconfig_url(例如:http://example.com/abc.pac
      • network.proxy.http(示例:abc-proxy.com)
      • network.proxy.http_port(示例:8080)

      private static WebDriver initFirefoxDriver(String appURL)  
      {
      
          System.out.println("Launching Firefox browser..");
      
          FirefoxProfile firefoxProfile = new FirefoxProfile();
          firefoxProfile.setPreference("network.proxy.type", 1);
          firefoxProfile.setPreference("network.proxy.autoconfig_url", "http://example.com/abc.pac");
          firefoxProfile.setPreference("network.proxy.http", " abc-proxy.com");
          firefoxProfile.setPreference("network.proxy.http_port", 8080);
      
      
          WebDriver driver = new FirefoxDriver(firefoxProfile);
          driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
          driver.manage().window().maximize();
          driver.navigate().to(appURL);
          //driver.get(appURL); 
          return driver;
      }
      

      【讨论】:

        【解决方案5】:

        针对不同的浏览器有不同的解决方案,但很少有程序化解决方案适用于所有浏览器。

        • 某些 WebDrivers(Chrome、Firefox)可以在 URL 中使用 user:pass@site 语法。有些人会在注册表被黑后接受这种语法,但会遇到稳定性问题 (IE)。
        • 某些 WebDrivers 允许您在其配置文件 (Firefox) 中设置首选项
        • 某些 WebDriver 允许您使用扩展程序 (Chrome) 设置修改其行为
        • 一些 WebDrivers 允许您通过 alert.authenticateUsing 与身份验证对话框进行交互(撰写本文时仅 IE)
        • 在撰写本文时,某些浏览器的 WebDrivers 无法执行上述任何操作 (Edge)

        没有使用第三方 GUI 自动化框架,应该在所有浏览器中工作的东西是设置一个代理,可以添加基本身份验证标头或任意标头(例如 BrowserMob ProxyFiddler、@987654323 @) 并将浏览器设置为通过它代理。

        另请参阅How to perform Basic Authentication for FirefoxDriver, ChromeDriver and IEdriver in Selenium WebDriver? 以及从中链接的答案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-22
          • 1970-01-01
          • 2014-08-09
          • 1970-01-01
          • 1970-01-01
          • 2017-12-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多