【问题标题】:How to handle Pop-up in Selenium WebDriver using Java如何使用 Java 处理 Selenium WebDriver 中的弹出窗口
【发布时间】:2013-10-24 14:22:28
【问题描述】:

我想在 rediff.com 中处理登录部分,但下面的代码对此不起作用:

driver.get("http://www.rediff.com/");
WebElement sign = driver.findElement(By.xpath("//html/body/div[3]/div[3]/span[4]/span/a"));
sign.click();
String myWindowHandle = driver.getWindowHandle();
driver.switchTo().window(myWindowHandle);
WebElement email_id= driver.findElement(By.xpath("//*[@id='signin_info']/a[1]"));
email_id.sendKeys("hi");

如果myWindowHandle不是正确的字符串,那么请告诉我如何获取弹出窗口名称,因为我找不到弹出窗口的名称。

【问题讨论】:

  • 使用 driver.getWindowHandles() 获取窗口列表。

标签: java selenium-webdriver popup popupwindow


【解决方案1】:

要切换到弹出窗口,您需要使用getWindowHandles() 并遍历它们。

在您的代码中,您使用的是getWindowHandle(),它将为您提供父窗口本身。

String parentWindowHandler = driver.getWindowHandle(); // Store your parent window
String subWindowHandler = null;

Set<String> handles = driver.getWindowHandles(); // get all window handles
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()){
    subWindowHandler = iterator.next();
}
driver.switchTo().window(subWindowHandler); // switch to popup window

// Now you are in the popup window, perform necessary actions here

driver.switchTo().window(parentWindowHandler);  // switch back to parent window

【讨论】:

  • 但是我只需要处理一个窗口,而不是我认为的所以没有意义使用迭代器...你有另一种方法吗?我只需要以 rediff.com 的形式输入电子邮件地址和密码。请在此指导我。
  • 上面的代码会处理这个问题。一旦你切换到子窗口,这是你的弹出窗口。选择 webelements 并填写您的电子邮件 ID、密码并提交。然后切换回你的父窗口。
  • 已尝试但代码在链接上不起作用:rediff.com -> 点击登录链接并尝试登录
  • @Johnp2:请不要劫持答案
【解决方案2】:

我找到了上述程序的解决方案,其目标是登录http://rediff.com

public class Handle_popupNAlert
{
    public static void main(String[] args ) throws InterruptedException
    {
        WebDriver driver= new FirefoxDriver(); 
        driver.get("http://www.rediff.com/");
        WebElement sign = driver.findElement(By.xpath("//html/body/div[3]/div[3]/span[4]/span/a"));
        sign.click();

        Set<String> windowId = driver.getWindowHandles();    // get  window id of current window
        Iterator<String> itererator = windowId.iterator();   

        String mainWinID = itererator.next();
        String  newAdwinID = itererator.next();

        driver.switchTo().window(newAdwinID);
        System.out.println(driver.getTitle());
        Thread.sleep(3000);
        driver.close();

        driver.switchTo().window(mainWinID);
        System.out.println(driver.getTitle());
        Thread.sleep(2000);

        WebElement email_id= driver.findElement(By.xpath("//*[@id='c_uname']"));
        email_id.sendKeys("hi");
        Thread.sleep(5000);

        driver.close();
        driver.quit();
    }  
}

【讨论】:

    【解决方案3】:

    您可以处理弹出窗口或警告框:

    Alert alert = driver.switchTo().alert();
    alert.accept();
    

    您也可以拒绝提醒框:

    Alert alert = driver.switchTo().alert();
    alert().dismiss();
    

    【讨论】:

      【解决方案4】:

      当您收到任何网络浏览器弹出警报消息框时,您可以在代码中使用以下代码。

      // Accepts (Click on OK) Chrome Alert Browser for RESET button.
      
      Alert alertOK = driver.switchTo().alert();
      alertOK.accept();
      
      
      
      //Rejects (Click on Cancel) Chrome Browser Alert for RESET button.
      
      Alert alertCancel = driver.switchTo().alert();
      alertCancel.dismiss();
      

      【讨论】:

      • 当您看到任何网络浏览器弹出警告消息框时,您可以在代码中使用上述代码。
      【解决方案5】:

      不要让情况变得复杂。如果可用,请使用ID

      driver.get("http://www.rediff.com");
      WebElement sign = driver.findElement(By.linkText("Sign in"));
      sign.click();
      WebElement email_id= driver.findElement(By.id("c_uname"));
      email_id.sendKeys("hi");
      

      【讨论】:

      • 我无法在弹出窗口中直接使用 email_id 字段。请访问 rediff.com,因为我想以 rediff.com 的形式输入电子邮件地址和密码。链接:rediff.com
      • 您使用的是哪个浏览器?因为点击登录后我没有看到任何弹出窗口。它只是另一个模态窗口(在主窗口内)。我正在使用 firefox23。
      • 是的,我需要访问它并登录
      • 点击sign-in 链接时遇到什么错误?任何权限错误?
      • 没有收到任何错误但无法处理电子邮件地址字段
      【解决方案6】:

      当 Firefox 的屏幕上弹出 toastr 消息时。下面的标签显示在火虫中。

      <div class="toast-message">Invalid Credentials, Please check Password</div>.
      

      我当时截图了。 并在 selenium java 代码中做了以下更改。

      String alertText = "";
      WebDriverWait wait = new WebDriverWait(driver, 5);
      wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("toast-message")));
      WebElement toast1 = driver.findElement(By.className("toast-message"));  
      alertText = toast1.getText();
      System.out.println( alertText);
      

      我的 toastr 弹出问题得到了解决。

      【讨论】:

        【解决方案7】:
        String parentWindowHandler = driver.getWindowHandle(); // Store your parent window
        String subWindowHandler = null;
        
        Set<String> handles = driver.getWindowHandles(); // get all window handles
        Iterator<String> iterator = handles.iterator();
        
        subWindowHandler = iterator.next();
        
        driver.switchTo().window(subWindowHandler); // switch to popup window
        
        // Now you are in the popup window, perform necessary actions here
        
        driver.switchTo().window(parentWindowHandler);  // switch back to parent window
        

        【讨论】:

          【解决方案8】:
                 //get the main handle and remove it
                 //whatever remains is the child pop up window handle
          
                 String mainHandle = driver.getWindowHandle();
                 Set<String> allHandles = driver.getWindowHandles();
                 Iterator<String> iter = allHandles.iterator();
                 allHandles.remove(mainHandle);
                 String childHandle=iter.next();
          

          【讨论】:

            【解决方案9】:
            public void Test(){
            
                 WebElement sign = fc.findElement(By.xpath(".//*[@id='login-scroll']/a"));
                    sign.click();
                    WebElement LoginAsGuest=fc.findElement(By.xpath(".//*[@id='guest-login-option']"));
                    LoginAsGuest.click();
                    WebElement email_id= fc.findElement(By.xpath(".//*[@id='guestemail']"));
                    email_id.sendKeys("ankushdeoladore@gmail.com");
                    WebElement ContinueButton=fc.findElement(By.xpath(".//*[@id='contibutton']"));
                    ContinueButton.click();
            
            }
            

            【讨论】:

              最近更新 更多