Создание файла JSON с использованием для каждого цикла и карты - повторяет первое значение элемента на всех итерациях цикла for - PullRequest
4 голосов
/ 14 июня 2019

Для каждого цикла ниже не добавляются все 6 значений из списка. Вместо этого он просто повторяет первое значение 6 раз. Также файл Json создан с теми же данными.

Примечание. Я также ссылался на эту ссылку, но не получил ожидаемый результат. Javascript каждый цикл по JSON, получая только первый элемент?

Шаги, следующие: 1. Найдите элементы tr и прочитайте данные один за другим. 2. При чтении сохраняйте эти значения также с помощью Map 3. Добавьте значения карты в массив Jason.

Ниже мой код,

public static void GetPercentageValue(String locatorType, String locatorValue) throws FileNotFoundException
{
    locatorType="xpath";
    locatorValue="//div[@class='content shadow']/div/child::table[1]/tbody/tr";
    List<WebElement>  tableRows=findTheElements(locatorType,locatorValue);
    for(WebElement tablerow : tableRows)
    {
        Map map = new LinkedHashMap(tableRows.size());
        row=row+1;
        String rowKeys=tablerow.findElement(By.xpath("//div[@class='content shadow']/div/child::table[1]/tbody/tr['"+row+"']/td[1]")).getText();
        String price=tablerow.findElement(By.xpath("//div[@class='content shadow']/div/child::table[1]/tbody/tr['"+row+"']//input")).getAttribute("value");
        System.out.println("RowDesc & Price: "+rowKeys+" "+price);
        map.put(rowKeys, price);
        jArr.add(map);
    }
    jaObj.put("Values", jArr);
     PrintWriter pWriter = new PrintWriter(mbsDataPath1);
     pWriter.write(jaObj.toJSONString());
     pWriter.flush();
     pWriter.close();
}

Ожидаемый результат должен быть:

RowDesc & Price: <80.000            0
RowDesc & Price: 80.000-150.000     2
RowDesc & Price: 150.000-300.000    10
RowDesc & Price: 300.000-500.000    15
RowDesc & Price: >500.000           18

Фактический результат вышеприведенного кода:

RowDesc & Price: <80.000 0
RowDesc & Price: <80.000 0
RowDesc & Price: <80.000 0
RowDesc & Price: <80.000 0
RowDesc & Price: <80.000 0

1 Ответ

3 голосов
/ 19 июня 2019

Решение простое. У вас неверный XPATH

String rowKeys=tablerow.findElement(By.xpath("//div[@class='content shadow']/div/child::table[1]/tbody/tr['"+row+"']/td[1]")).getText();
String price=tablerow.findElement(By.xpath("//div[@class='content shadow']/div/child::table[1]/tbody/tr['"+row+"']//input")).getAttribute("value");

Как вы передаете row переменная имеет решающее значение!

Вы передаете его в виде строки (в контексте Xpath) вместо цифры.

Предположим, что row=1

Ваш Xpath выглядит так:

String rowKeys=tablerow.findElement(By.xpath("//div[@class='content shadow']/div/child::table[1]/tbody/tr['1']/td[1]")).getText();

Вы видите это сейчас? Вы создаете tr['1'] вместо tr[1] и YES - это имеет значение. Если вы передадите его как tr['1'], тогда вы будете сопоставлять ВСЕ элементы tr вместо определенного индекса. Это заставляет Selenium всегда соответствовать первому элементу из списка всех tr s!

Просто измените свои Xpath на:

String rowKeys=tablerow.findElement(By.xpath("//div[@class='content shadow']/div/child::table[1]/tbody/tr["+row+"]/td[1]")).getText();
String price=tablerow.findElement(By.xpath("//div[@class='content shadow']/div/child::table[1]/tbody/tr["+row+"]//input")).getAttribute("value");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...