如何使用Selenium Webdriver处理登录弹出窗口? 我在此处附上示例屏幕。 如何在此登录弹出/警报窗口中输入用户名和密码?
谢谢和问候,
如何使用Selenium Webdriver处理登录弹出窗口? 我在此处附上示例屏幕。 如何在此登录弹出/警报窗口中输入用户名和密码?
谢谢和问候,
使用在URL请求中发送用户名和密码的方法:
http://username:password@the-site.com
所以为了更清晰明确。用户名是username
,密码是password
,其余部分是您测试网站的常规URL。
对我而言没有需要任何调整即可工作。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...
}
http://username:password@localhost:4040/lgserver/admin/operations/overview/
。 - Pavel Janicek这应该适用于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支持使用基本认证和摘要认证进行身份验证。它使用CDP,目前仅支持基于Chromium的浏览器。
例如:
Java示例:
Webdriver driver = new ChromeDriver();
((HasAuthentication) driver).register(UsernameAndPassword.of("username", "pass"));
driver.get("http://sitewithauth");
注意:在Alpha-7版本中存在一个bug,它会将用户名发送给用户和密码。需要等待下一个Selenium版本的发布,因为修复程序已经在主干中可用。https://github.com/SeleniumHQ/selenium/commit/4917444886ba16a033a81a2a9676c9267c472894
解决方案:使用Thread和Robot进行Windows活动目录身份验证
我使用Java Thread和Robot与Selenium webdriver自动化我们网站的Windows活动目录身份验证过程。这个逻辑在Firefox和Chrome中运行良好,但在IE中不起作用。
由于某种原因,当弹出身份验证窗口时,IE会杀死webdriver,而Chrome和Firefox则会防止web driver被杀死。我没有尝试其他浏览器,如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);
}
}
}
用户名:admin
和密码:admin
:WebDriver driver = new ChromeDriver();
driver.get("https://admin:admin@your website url");
obj = driver.switch_to.alert
obj.send_keys(keysToSend="username\ue004password")
obj.accept()
这里是制表符的值,可以在源代码的Keys类中找到。
我猜在JAVA中也可以使用相同的方法,但不确定。
我的使用情况是:
我使用的是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());
弹出窗口的类型在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/中。
只需切换到警报窗口,使用authenticateUsing
设置用户名和密码,然后返回到父窗口即可。
Alert Windowalert = driver.switchTo().alert() ;
Windowalert.authenticateUsing(new UserAndPassword(_user_name,_password));
driver.switchTo().defaultContent() ;