如何使用 Selenium Webdriver 处理登录弹出窗口?我在此处附上了示例屏幕。如何在此登录弹出/警报窗口中输入/输入用户名和密码?
感谢和问候,
如何使用 Selenium Webdriver 处理登录弹出窗口?我在此处附上了示例屏幕。如何在此登录弹出/警报窗口中输入/输入用户名和密码?
感谢和问候,
使用在 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...
}
这应该适用于 windows server 2012 和 IE。
var alert = driver.SwitchTo().Alert();
alert.SetAuthenticationCredentials("username", "password");
alert.Accept();
这在 WebDriver 3.0 中非常简单(目前它是 Beta 版)。
Alert alert = driver.switchTo().alert() ;
alert.authenticateUsing(new UserAndPassword(_user_name,_password));
driver.switchTo().defaultContent() ;
希望这会有所帮助。
现在在 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
解决方案:使用 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);
}
}
}
处理身份验证弹出窗口的最简单方法是在 Url 本身中输入凭据。例如,我有像Username: admin
和这样的凭证Password: admin
:
WebDriver driver = new ChromeDriver();
driver.get("https://admin:admin@your website url");
这是基于 Python 的 selenium 的解决方案,经过源代码(此处)。我发现这 3 个步骤很有用。
obj = driver.switch_to.alert
obj.send_keys(keysToSend="username\ue004password")
obj.accept()
这里 \ue004 是 TAB 的值,您可以在源代码的 Keys 类中找到它。
我想同样的方法也可以在 JAVA 中使用,但不确定。
我的用例是:
我使用的是 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());
您可以使用此 Autoit 脚本来处理登录弹出窗口:
WinWaitActive("Authentication Required","","10")
If WinExists("Authentication Required") Then
Send("username{TAB}")
Send("Password{Enter}")
EndIf'
每当我的应用程序打开时,我都会收到 Windows 安全警报。为了解决这个问题,我使用了以下程序
import org.openqa.selenium.security.UserAndPassword;
UserAndPassword UP = new UserAndPassword("userName","Password");
driver.switchTo().alert().authenticateUsing(UP);
这解决了我登录应用程序的问题。我希望这可以帮助所有正在寻找身份验证 Windows 安全警报的人。
只需切换到警报并使用authenticateUsing
设置用户名和密码,然后返回父窗口
Alert Windowalert = driver.switchTo().alert() ;
Windowalert.authenticateUsing(new UserAndPassword(_user_name,_password));
driver.switchTo().defaultContent() ;
弹出窗口的类型在 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/
在 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 与已知命令不匹配'
处理此问题的一种方法是您可以使用 url 提供登录详细信息。例如,如果您的 url 是“ http://localhost:4040 ”并且它在警报提示消息中询问“用户名”和“密码”,那么您可以将 baseurl 作为“ http://username:password@localhost:4040 ”传递。希望它有效
以下 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();
我使用 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);
}
}