如何使用Selenium WebDriver处理loginpopup窗口?

如何使用Selenium Webdriver处理loginpopup窗口? 我在这里附上了示例屏幕。 如何input/input用户名和密码到这个loginpopup/警告窗口?

感谢和问候, 在这里输入图像描述

使用在URL请求中发送用户名和密码的方法:

http://username:password@the-site.com 

所以只是为了更清楚。 用户名是username密码是password ,其余的是您的testing网站的通常的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(); 

解决scheme:使用Thread和Robot进行Windows活动目录validation

我使用Java Thread和Robot和Selenium webdriver来自动化我们网站的Windows活动目录validation过程。 这种逻辑在Firefox和Chrome中运行良好,但在IE中无法使用。 出于某种原因,当popupauthentication窗口时IE会杀死webdriver,而Chrome和Firefox会阻止网页驱动程序死亡。 我没有尝试在其他networking浏览器,如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); } } } 

这在WebDriver 3.0中是非常简单的(截至目前它在Beta中)。

 Alert alert = driver.switchTo().alert() ; alert.authenticateUsing(new UserAndPassword(_user_name,_password)); driver.switchTo().defaultContent() ; 

希望这有助于。

谢谢,KM Prusty

以下Selenium-Webdriver Java代码应该可以很好地处理警报/popup窗口:

 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,然后创build这样的代码,并修改后的几个代码工作:

  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); } } 

更好的是你更喜欢Autoit工具来处理你所有的Windows活动。 你可以使用AutoIt工具来处理你的窗口任务的脚本,然后在那个exe可以使用Selenium运行。

每当我的应用程序打开时,我都会收到Windows安全警报。 解决这个问题,我用下面的程序

 import org.openqa.selenium.security.UserAndPassword; UserAndPassword UP = new UserAndPassword("userName","Password"); driver.switchTo().alert().authenticateUsing(UP); 

这解决了我login到应用程序的问题。 我希望这可以帮助谁正在寻找authentication的Windows安全警报。

只需切换到警报并使用authenticateUsing设置使用名和密码,然后回到父窗口

 Alert Windowalert = driver.switchTo().alert() ; Windowalert.authenticateUsing(new UserAndPassword(_user_name,_password)); driver.switchTo().defaultContent() ; 

您可以使用此Autoit脚本来处理loginpopup窗口:

 WinWaitActive("Authentication Required","","10") If WinExists("Authentication Required") Then Send("username{TAB}") Send("Password{Enter}") EndIf'