【问题标题】:How to automate basic authentication chrome alert如何自动化基本身份验证 chrome 警报
【发布时间】:2018-05-01 04:26:41
【问题描述】:
尝试了几种方法来处理它,但都没有成功。
https://user:password@pageaddress.com - 不起作用,chrome 启动受控 bu 会自动执行测试软件,并且仍然会出现身份验证弹出窗口。
将 --disable-blink-features=BlockCredentialedSubresources 添加到 Chrome arg 并重复第 1 点 - 不起作用,原因与第 1 点相同。
-
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;
}}
-
通过 selenium Action() 触发键盘或鼠标事件也不起作用。
chromedriver 2.31
Google Chrome Version 61
还有其他想法吗?也许一些js脚本?
【问题讨论】:
标签:
java
google-chrome
authentication
selenium-chromedriver
alert
【解决方案1】:
我有类似的here。
不过,您可能不需要完整的 Native Messaging API...
这将全部是 JavaScript,并且适用于任何浏览器生成的身份验证请求(至少看起来是这样)。
webRequest - chrome 和 firefox - 具有 anAuthRequired 事件。
您可以使用侦听器连接到此,然后只需通过一些 examples 传递您需要的凭据。
如果您只想传递不会更改的用户凭据,则需要使用同步方法 - 它更容易。 This question 确实可以满足您的所有需求。
如果您需要传递不同的凭据,您可能很想研究异步方法,这是我必须使用的方法。
如果您使用的是 chrome,请忘记 promises ... 但 Firefox 应该可以使用它们。
希望这有帮助!
【解决方案2】:
最后 - 我能够通过 Robot Framework 做到这一点,这不是我引以为豪的解决方案,但没有任何其他想法。
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;
}