迭代器方法中的java.util.NoSuchElementException

迭代器方法中的java.util.NoSuchElementException,java,selenium,selenium-webdriver,nosuchelementexception,window-handles,Java,Selenium,Selenium Webdriver,Nosuchelementexception,Window Handles,我对编码比较陌生 下面是我的程序代码,它打开一个窗口(flipkart.com)>点击网页内的图标进入第二个窗口。现在我想为第一页和第二页生成窗口句柄,但它会给我以下给出的错误 计划: package MoinPrograms; import java.util.Iterator; import java.util.Set; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.open

我对编码比较陌生

下面是我的程序代码,它打开一个窗口(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);
    }

}

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

Iterator<String> k = FlipKart.iterator();
while (k.hasNext()) {
        String handle = k.next();
        System.out.println(handle);
}
Iterator k=FlipKart.Iterator();
while(k.hasNext()){
字符串句柄=k.next();
系统输出打印LN(手柄);
}

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

包装云纹图;
导入java.util.Iterator;
导入java.util.Set;
导入java.util.concurrent.TimeUnit;
导入org.openqa.selenium.By;
导入org.openqa.selenium.WebDriver;
导入org.openqa.selenium.firefox.FirefoxDriver;
公共类鼠标指针{
公共静态void main(字符串[]args){
WebDriver=newfirefoxdriver();
driver.manage().window().maximize();
驱动程序。获取(“https://www.flipkart.com/");
driver.manage().timeouts().implicitlyWait(3000,TimeUnit.SECONDS);
findElement(By.xpath(“//button[@class=\”“\u 2AkmmA\u 29YdH8\”))。单击();
findelelement(By.xpath(“//p[@class=\“\u 1AuloC\”和text()=\“Mobiles&Tablets\”))。单击();
设置FlipKart=driver.getWindowHandles();
迭代器k=FlipKart.Iterator();
while(k.hasNext()){
字符串handle1=k.next();
系统输出打印LN(handle1);
}
}
}

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

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

ArrayList<String> flipkart = new ArrayList<String>(driver.getWindowHandles()); 
        Iterator<String> k = flipkart.iterator();
        while (k.hasNext()) {
                String handle = k.next();
                System.out.println(handle);
        }
ArrayList flipkart=新的ArrayList(driver.getWindowHandles());
迭代器k=flipkart.Iterator();
while(k.hasNext()){
字符串句柄=k.next();
系统输出打印LN(手柄);
}
java.util.nosuchelementexception 根据的Java文档,由各种访问器方法抛出,以指示所请求的元素不存在

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

问题的根本原因 在您的用例中,java.util.NoTouchElementException的根本原因如下所示:

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);
  • next()
    方法无法按照代码中的
    MouseOverActions.java:24
    返回任何元素:

    String handle2 = k.next();
    
解释 单击.xpath(“//p[@class=\“\u 1AuloC\”和text()=\“Mobiles&Tablets\”])标识为
的元素前后
只有一个窗口句柄,
String handle1
被分配了窗口句柄。因为没有第二个窗口句柄可用
String handle2=k.next()
引发
java.util.nosuchelementexception

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

  • 删除代码行:

    String handle2 = k.next();
    
    System.out.println(handle2);
    
  • 删除代码行:

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

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

在这里,您可以找到关于

首次进入页面时如何处理登录弹出窗口的详细讨论?可能是您的代码找不到元素,因为它首先显示一个登录弹出窗口。