Использование Java для утверждения первого элемента в списке <>

Для практики я использую Selenium (java) для создания тестового поиска в Google по запросу «Selenium» и утверждаю, что первый результат вверху страницы результатов предназначен для SeleniumHQ.

Прошло много лет с тех пор, как я использовал Java, и мне трудно вспомнить, как выполнять итерацию по списку и утверждать первый объект в списке.

public class SeleniumTest {

    private static String baseURL = "http://google.com";
    private static String searchTerm = "Selenium";
    private static String seleniumResultString = "Selenium - Web Browser Automation";
    private static String googleSearchBarLocatorById = "lst-ib";
    private static String googleResultLocatorByClassName = "r";


    public void driverProperties() {
        System.setProperty("webdriver.chrome.driver", "/Users/<<user>>/Downloads/chromedriver");

    }

    private void searchGoogleForSelenium() {
        WebDriver driver = new ChromeDriver();
        driver.get(baseURL);
        ((ChromeDriver) driver).findElementById(googleSearchBarLocatorById).sendKeys(searchTerm);
        ((ChromeDriver) driver).findElementById(googleSearchBarLocatorById).sendKeys(Keys.ENTER);
    }

    private void returnGoogleResults() {
        WebDriver driver = new ChromeDriver();
        List<WebElement> resultTitles = new ArrayList<>(((ChromeDriver) driver).findElementsByClassName(googleResultLocatorByClassName));
        if (resultTitles.get(0).equals(seleniumResultString)) {
            System.out.println(seleniumResultString + " is the first result!");
            driver.close();
        } else {
            System.out.println(seleniumResultString + " is not the first result!");
            driver.close();
        }

    }

    @Test
    public void seleniumResultsTest() {
        driverProperties();
        searchGoogleForSelenium();
        returnGoogleResults();
    }
}

Выход:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    at java.util.ArrayList.get(ArrayList.java:433)
    at com.slg.selenium.SeleniumTest.returnGoogleResults(SeleniumTest.java:36)
    at com.slg.selenium.SeleniumTest.seleniumResultsTest(SeleniumTest.java:48)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Надеюсь, что кто-то может помочь определить мою ошибку здесь. Большое спасибо за любую помощь !!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
298
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот:

List<WebElement> resultTitles = new ArrayList<>(((ChromeDriver) driver).findElementsByClassName(googleResultLocatorByClassName));

может создать список размером 0, и когда вы пытаетесь получить первый элемент пустого списка, вы получаете java.lang.IndexOutOfBoundsException. Вот почему добавляем:

if (resultTitles.size() > 0)

или как уже упоминалось @AndyTurner:

if (!resultTitles.isEmpty())

Заменять:

private void returnGoogleResults() {
        WebDriver driver = new ChromeDriver();
        List<WebElement> resultTitles = new ArrayList<>(((ChromeDriver) driver).findElementsByClassName(googleResultLocatorByClassName));
        if (resultTitles.get(0).equals(seleniumResultString)) {
            System.out.println(seleniumResultString + " is the first result!");
            driver.close();
        } else {
            System.out.println(seleniumResultString + " is not the first result!");
            driver.close();
        }

    }

с участием:

private void returnGoogleResults() {
  WebDriver driver = new ChromeDriver();
  List<WebElement> resultTitles = new ArrayList<>(((ChromeDriver) driver).findElementsByClassName(googleResultLocatorByClassName));
  if (!resultTitles.isEmpty() && resultTitles.get(0).equals(seleniumResultString)) {
    System.out.println(seleniumResultString + " is the first result!");
    driver.close();
  } else {
    System.out.println(seleniumResultString + " is not the first result!");
    driver.close();
  }

}

PS:

List<WebElement> resultTitles = new ArrayList<>(((ChromeDriver) driver).findElementsByClassName(googleResultLocatorByClassName));

можно упростить так:

List<WebElement> resultTitles = driver.findElementsByClassName(googleResultLocatorByClassName));

А также:

private void searchGoogleForSelenium() {
    WebDriver driver = new ChromeDriver();
    driver.get(baseURL);
    ((ChromeDriver) driver).findElementById(googleSearchBarLocatorById).sendKeys(searchTerm);
    ((ChromeDriver) driver).findElementById(googleSearchBarLocatorById).sendKeys(Keys.ENTER);
}

можно заменить на:

private void searchGoogleForSelenium() {
    WebDriver driver = new ChromeDriver();
    driver.get(baseURL);
    driver.findElementById(googleSearchBarLocatorById).sendKeys(searchTerm);
    driver.findElementById(googleSearchBarLocatorById).sendKeys(Keys.ENTER);
}

Или (возможно) более идиоматично: if (!resultTitles.isEmpty())

Andy Turner 16.07.2018 20:28

@AndyTurner Думаю, ваше предложение лучше моего. Я добавил это к своему ответу. Надеюсь, это нормально?

Andrei Suvorkov 16.07.2018 20:49

РАДИКАЛЬНЫЙ! СПАСИБО!! :)

Axos 17.07.2018 01:59

Другие вопросы по теме