【问题标题】:java.util.NoSuchElementException in iterator method迭代器方法中的 java.util.NoSuchElementException
【发布时间】:2018-05-16 10:18:20
【问题描述】:

我对编码比较陌生。

下面是我的程序的代码,它打开一个窗口(flipkart.com)> 通过单击网页内的图标进入辅助窗口。现在我想为第一页和第二页生成窗口句柄,但它给了我如下错误

程序:

package MoinPrograms;

import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class MouseOverActions {

    public static void main(String[] args) {

        WebDriver driver = new FirefoxDriver();
        driver.manage().window().maximize();
        driver.get("https://www.flipkart.com/");
        driver.manage().timeouts().implicitlyWait(3000, TimeUnit.SECONDS);
        driver.findElement(By.xpath("// button [@class=\"_2AkmmA _29YdH8\"]")).click();
        driver.findElement(By.xpath("//p [@class=\"_1AuloC\"and text()= \"Mobiles & Tablets\"]")).click();
        Set<String> FlipKart = driver.getWindowHandles();
        Iterator<String> k = FlipKart.iterator();
        String handle1 = k.next();
        String handle2 = k.next();
        System.out.println(handle1);
        System.out.println(handle2);
    }

}

错误:

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.LinkedHashMap$LinkedHashIterator.nextNode(Unknown Source)
    at java.base/java.util.LinkedHashMap$LinkedKeyIterator.next(Unknown Source)
    at MoinPrograms.MouseOverActions.main(MouseOverActions.java:24)

【问题讨论】:

  • 您是如何处理第一次进入页面时的登录弹出窗口的?可能是您的代码找不到元素,因为它首先出现了一个登录弹出窗口。

标签: java selenium selenium-webdriver nosuchelementexception window-handles


【解决方案1】:

使用while-loop 确保获取所有元素:

Iterator<String> k = FlipKart.iterator();
while (k.hasNext()) {
        String handle = k.next();
        System.out.println(handle);
}

【讨论】:

    【解决方案2】:

    你需要使用 hasNext() 方法检查你的列表以确保它有一个元素。

    package MoinPrograms;
    
    import java.util.Iterator;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    
    public class MouseOverActions {
    
        public static void main(String[] args) {
    
            WebDriver driver = new FirefoxDriver();
            driver.manage().window().maximize();
            driver.get("https://www.flipkart.com/");
            driver.manage().timeouts().implicitlyWait(3000, TimeUnit.SECONDS);
            driver.findElement(By.xpath("// button [@class=\"_2AkmmA _29YdH8\"]")).click();
            driver.findElement(By.xpath("//p [@class=\"_1AuloC\"and text()= \"Mobiles & Tablets\"]")).click();
            Set<String> FlipKart = driver.getWindowHandles();
            Iterator<String> k = FlipKart.iterator();
            while(k.hasNext()){
              String handle1 = k.next();
              System.out.println(handle1);
            }
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      您的代码中只有一个句柄可用:

      您可以使用以下代码获取它:

      ArrayList<String> flipkart = new ArrayList<String>(driver.getWindowHandles()); 
              Iterator<String> k = flipkart.iterator();
              while (k.hasNext()) {
                      String handle = k.next();
                      System.out.println(handle);
              }
      

      【讨论】:

        【解决方案4】:

        java.util.nosuchelementexception

        根据java.util.nosuchelementexceptionJava Docs,由各种访问器方法抛出以指示所请求的元素不存在。

        现在,如果您查看 next() 方法的 Java Docs,它清楚地提到 next() 方法返回迭代中的下一个元素或 NoSuchElementException 如果迭代没有更多元素。

        问题的根本原因

        在您的用例中,java.util.nosuchelementexception 的根本原因如下:

        • next() 方法无法根据您的代码中的MouseOverActions.java:24 返回任何元素:

          String handle2 = k.next();
          

        说明

        在单击标识为By.xpath("//p [@class=\"_1AuloC\"and text()= \"Mobiles &amp; Tablets\"]") 的元素之前和之后,只有一个窗口句柄,而String handle1 被分配了窗口句柄。由于没有第二个 Window Handle 可用String handle2 = k.next(); raises java.util.nosuchelementexception.

        解决方案

        您需要对自己的代码进行以下调整:

        • 去掉这行代码:

          String handle2 = k.next();
          
        • 去掉这行代码:

          System.out.println(handle2);
          
        • Firefox 浏览器 以最大化模式打开时,您不需要进一步maximize 它,因此删除该行:

          driver.manage().window().maximize();
          
        • Selenium Java 客户端 更新到 v3.12.0 并将以下 JVM 属性与 GeckoDriver 结合使用:

          System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
          
        • 您自己打印窗口句柄的代码块如下:

          System.setProperty("webdriver.gecko.driver", "C:\\path\\to\\geckodriver.exe");
          WebDriver driver = new FirefoxDriver();
          driver.get("https://www.flipkart.com/");
          driver.manage().timeouts().implicitlyWait(3000, TimeUnit.SECONDS);
          driver.findElement(By.xpath("// button [@class=\"_2AkmmA _29YdH8\"]")).click();
          driver.findElement(By.xpath("//p [@class=\"_1AuloC\"and text()= \"Mobiles & Tablets\"]")).click();
          Set<String> FlipKart = driver.getWindowHandles();
          Iterator<String> k = FlipKart.iterator();
          String handle1 = k.next();
          System.out.println(handle1);
          
        • 控制台输出:

          4294967297
          

        在这里你可以找到关于Best way to keep track of Windows with Selenium in IE11?的详细讨论

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-21
          • 2023-03-06
          • 1970-01-01
          相关资源
          最近更新 更多