java.util.NoSuchElementException в методе итератора - PullRequest
0 голосов
/ 16 мая 2018

Я относительно новичок в кодировании.

Ниже приведен код моей программы, которая открывает окна (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)

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

java.util.nosuchelementexception

Согласно Java Docs из java.util.nosuchelementexception генерируется различными методами доступа, чтобы указать, чтозапрашиваемый элемент не существует.

Теперь, если вы посмотрите на метод Java Docs из next(), в нем явно упоминается next () метод возвращает следующий элемент в итерации или NoSuchElementException , если в итерации больше нет элементов.

Root Причина проблемы

В вашемВ случае использования основная причина java.util.nosuchelementexception заключается в следующем:

  • Метод next() не может вернуть какой-либо элемент согласно MouseOverActions.java:24 в вашем коде:

    String handle2 = k.next();
    

Объяснение

До и после нажатия на элемент, обозначенный как By.xpath("//p [@class=\"_1AuloC\"and text()= \"Mobiles & Tablets\"]"), существует только одна Дескриптор окна и String handle1 назначается с помощью Window Handle .Поскольку второй дескриптор окна не доступен String handle2 = k.next(); поднимает java.util.nosuchelementexception.

Решение

Вам необходимо внести следующие изменения в свой собственный код:

  • Удалить строку кода:

    String handle2 = k.next();
    
  • Удалить строку кода:

    System.out.println(handle2);
    
  • Поскольку Браузер Firefox открывается в развернутом режиме, вам не нужно maximize делать это дальше, поэтому удалите строку:

    driver.manage().window().maximize();
    
  • Обновите Selenium Java Client до 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?

0 голосов
/ 16 мая 2018

вам нужно проверить свой список, чтобы убедиться, что в нем есть элемент с помощью метода 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);
        }
    }

}
0 голосов
/ 16 мая 2018

В вашем коде доступна только одна ручка:

Вы можете получить его, используя этот код:

ArrayList<String> flipkart = new ArrayList<String>(driver.getWindowHandles()); 
        Iterator<String> k = flipkart.iterator();
        while (k.hasNext()) {
                String handle = k.next();
                System.out.println(handle);
        }
0 голосов
/ 16 мая 2018

Используйте while -loop, чтобы получить все элементы:

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