代码之家  ›  专栏  ›  技术社区  ›  Michal

如何自动执行基本身份验证chrome警报

  •  3
  • Michal  · 技术社区  · 8 年前

    Chrome authentication popup

    已经尝试了几种方法来处理它,但都没有奏效。

    1. https://user:password@pageaddress.com -不起作用,chrome启动控制bu自动测试软件,验证弹出窗口无论如何都会出现。

    2. 正在添加 --disable-blink-features=BlockCredentialedSubresources 要Chrome arg并重复1'st point-不起作用,原因与1'st point相同。

    3. driver.switchTo().alert.authenticateUsing(new UserAndPassword(user, password)) -这里的驱动程序似乎没有看到警报,使用强制方法检查警报并返回false:

      private Alert alert; public boolean isAlertPresent() { try { waitForTimeout(10, TimeUnit.SECONDS); alert = driver.switchTo().alert(); return true; } catch (NoAlertPresentException e) { return false; }}

    4. 通过selenium触发键盘或鼠标事件 Action() 也不起作用。

      chromedriver 2.31 Google Chrome Version 61

    还有其他想法吗?也许是js脚本?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Lex Woodfinger    8 年前

    我也有过类似的经历 here . 不过,您可能不需要完整的本机消息传递API。。。 这都是JavaScript,适用于任何浏览器生成的身份验证请求(至少看起来是这样)。

    Web请求- chrome firefox -具有anAuthRequired事件。 examples .

    如果您只想传入不会更改的用户凭据,那么您需要使用同步方法——这要容易得多。 This question 真的,这就是你所需要的一切。

    如果您需要传递不同的凭据,您可能需要研究异步方法,这是我必须使用的方法。 如果你用的是chrome,那就忘了吧 promises ... 但是Firefox应该与他们合作。

    希望这有帮助!

        2
  •  0
  •   Michal    8 年前

    最后,我能够通过机器人框架来实现它,这不是一个我引以为傲的解决方案,但我没有任何其他想法。

    import java.awt.*;
    import java.awt.datatransfer.StringSelection;
    import java.awt.event.KeyEvent;
    
    private Robot robot;
    
    public void login(String login, String password) {
        copyValueFromClipboardToInput(login);
        getRobot().keyPress(KeyEvent.VK_TAB);
        getRobot().keyRelease(KeyEvent.VK_TAB);
        copyValueFromClipboardToInput(password);
        getRobot().keyPress(KeyEvent.VK_ENTER);
        getRobot().keyRelease(KeyEvent.VK_ENTER);
    }
    
    private void copyValueFromClipboardToInput(String value) {
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(value), null);
        getRobot().keyPress(KeyEvent.VK_CONTROL);
        getRobot().keyPress(KeyEvent.VK_V);
        getRobot().keyRelease(KeyEvent.VK_V);
        getRobot().keyRelease(KeyEvent.VK_CONTROL);
    }
    
    private Robot getRobot() {
        if (robot == null) {
            try {
                robot = new Robot();
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
        return robot;
    }