Выберите элементы из 3 выпадающих с зависимостью от первого - PullRequest
0 голосов
/ 19 ноября 2018

Что я хочу сделать, это: 1- Переход на этот сайт: http://www.emlakyonetim.com.tr/tr-TR/sitelerimiz, 2- Нажмите на первое раскрывающееся меню - выберите город, щелкните второе раскрывающееся меню - выберите округ, щелкните третье раскрывающееся меню.

Короче говоря, вторые выпадающие элементы зависят от первого и третьи выпадающие элементы зависят от второго.

Код (не полный):

@Test
public void SiteCek() throws InterruptedException
{
    driver.get("http://www.emlakyonetim.com.tr/tr-TR/sitelerimiz");
    Thread.sleep(2000);

    driver.findElement(By.id("select2-city-list-container")).click();

    List<WebElement> elm = driver.findElements(By.xpath("//*[@class='select2-results__option']"));

    for(int i = 1; i < elm.size(); i++) 
    {   
            By ID = By.id(driver.findElements(By.xpath("//*[@class='select2-results__option']")).get(i).getText());
            System.out.println(ID);         

            driver.findElements(By.xpath("//*[@class='select2-results__option']")).get(i).click();
            Thread.sleep(500);
    } 
}

Я получаю java.lang.IndexOutOfBoundsException: Index: 2, Size: 0 error после города "ADANA". Если мне удастся обработать первую ошибку, я напишу второй и третий для циклов, так что код пока такой.

Когда проблема будет решена, я хочу сначала получить все города. Затем графства каждого города. Тогда сайты каждого уезда. Это должно быть сделано динамически, как размер списка городов, списка округов и списка сайтов. Для этого мне нужно три вложенных в петли. После всего этого каждое значение должно быть написано в Excel.

1 Ответ

0 голосов
/ 19 ноября 2018

вот код, который работал для меня

 public void testMethod() {
    driver.manage().window().maximize();

    WebElement firstDropDown = driver.findElement(By.id("select2-city-list-container"));
    firstDropDown.click();
    sleep();
    List<WebElement> citiesEls = getCitiesEls();
    Map<String, Map<String, List<String>>> cityData = new HashMap<>();
    for (int i = 0; i < citiesEls.size(); i++) {
        //we need to take this element every iteration, because it gets reloaded every time we open the dropdown
        WebElement cityEl = driver.findElement(By.id("select2-city-list-results")).findElements(By.xpath("//*[contains(@id,'select2-city-list-result')]")).get(i);
        String cityText = cityEl.getText();
        cityEl.click();
        sleep();

        cityData.put(cityText, getRegions());

        firstDropDown.click();
        sleep();
    }

    System.out.println(cityData);
}

private Map<String, List<String>> getRegions() {
    WebElement secondDropDown = driver.findElement(By.id("select2-region-list-container"));
    secondDropDown.click();
    sleep();
    List<WebElement> regionsEls = getRegionEls();
    Map<String, List<String>> regionData = new HashMap<>();
    for (int i = 0; i < regionsEls.size(); i++) {
        WebElement regionEl = driver.findElement(By.id("select2-region-list-results")).findElements(By.xpath("//*[contains(@id,'select2-region-list-result')]")).get(i);
        String regionText = regionEl.getText();
        regionEl.click();
        WebElement thirdDropDown = driver.findElement(By.id("select2-site-list-container"));
        thirdDropDown.click();
        List<WebElement> sitesEl = getSiteEls();
        List<String> sitesTexts = getSites(sitesEl);
        //populate region data
        regionData.put(regionText, sitesTexts);

        secondDropDown.click();
        sleep();
    }
    return regionData;
}

private List<String> getSites(List<WebElement> sitesEl) {
    List<String> sitesTexts = new ArrayList<>();
    for (WebElement siteEl : sitesEl) {
        sitesTexts.add(siteEl.getText());
    }
    return sitesTexts;
}

private List<WebElement> getSiteEls() {
    WebElement ulSites = driver.findElement(By.id("select2-site-list-results"));
    return ulSites.findElements(By.xpath("//*[contains(@id,'select2-site-list-result')]"));
}

private List<WebElement> getRegionEls() {
    return driver.findElement(By.id("select2-region-list-results")).findElements(By.xpath("//*[contains(@id,'select2-region-list-result')]"));
}

private List<WebElement> getCitiesEls() {
    return driver.findElement(By.id("select2-city-list-results")).findElements(By.xpath("//*[contains(@id,'select2-city-list-result')]"));
}

Поскольку данные динамически изменяются после каждого клика, вам может потребоваться некоторая задержка после каждого клика. Приведенный ниже код хорошо работает на Mac + Chrome. Тем не менее, если это не удается, добавьте вызов метода сна после каждого клика.

  private void sleep() {
      try {
          Thread.sleep(1000);
      } catch (InterruptedException e) {
          throw new IllegalStateException(e);
      }
    }

Важное примечание. Сны не рекомендуется использовать, и их следует использовать только в качестве быстрого временного решения. Более надежным решением является использование интеллектуальных ожиданий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...