#java #selenium #selenium-webdriver #indexing #webdriver
#java #selenium #selenium-webdriver #индексирование #webdriver
Вопрос:
Итак, я пытаюсь добавить 2 объекта Item в список, просматривая его, но каким-то образом 2-й элемент переопределяет первый. Извините, прошло некоторое время с тех пор, как я кодировал, поэтому мне трудно понять, что я сделал не так, поскольку я ожидаю, что имена для этих элементов разные. 😀
public static List<Item> buyList = new ArrayList<Item>();
int qty=2;
public static void buyItems(int qty)
{
for(int i=1; i<=qty; i )
{
Item thisItem = new Item();
thisItem.setName(driver.findElement("//xpathOfName[" i "]").getText()));
thisItem.setPrice(driver.findElement("//xpathOfPrice[" i "]").getText()));
// System.out.println("this item is >>>>>>>>" thisItem.getName());
buyList.add(thisItem);
// System.out.println("item at 0 is >>>>>>>>" buyList.get(0).getName());
}
}
Перед добавлением «thisItem» в buyList выводится правильное имя. Но в тот момент, когда я печатаю его вне цикла, он печатает второй элемент дважды (те, которые я закомментировал). Я также пытался напрямую добавить новый элемент с именем и ценой в качестве параметров, но, похоже, он по-прежнему перезаписывает ранее добавленный элемент в список.
Я попытался упростить приведенный ниже HTML-код:
<ul>
<li id="item-1">
<div>
<h4>First Item</h4>
</div>
</li>
<li id="item-2">
<div>
<h4>Second Item</h4>
</div>
</li>
</ul>
Комментарии:
1. Возможно ли
xpathOfName["i"]
, что на самом деле ваш первый элемент не найден? В вашем Java-коде нет ничего плохого. Вы можете отладить это с помощью обычного списка объектов. Чтобы было более понятно, вставьте также свои HTML-коды. Кроме того, вы не печатаете вне цикла, вы также печатаете внешний метод. Поскольку это статический список, это не должно иметь значения. Просто указываю на пояснения для будущих читателей.2. Отладьте свой код, чтобы увидеть все значения.
3. Вставлен упрощенный HTML-код. Как вы можете видеть, причина, по которой мне пришлось создать xpath подобным образом (встраивание индекса в строку xpath), заключается в том, что HTML содержит имя динамической переменной (item-1, item-2, item-3 ….). Мне нужно было сделать это, чтобы я мог получить указанное количество этих элементов. Я исправил печать вне метода. Он должен быть внутри. Это как-то связано с редактированием кода здесь, чтобы удалить ненужные строки.
Ответ №1:
Поскольку вы вызвали цикл и хотите получить доступ к элементу через индекс, вам необходимо заменить следующие строки:
thisItem.setName(driver.findElement("//xpathOfName[" i "]").getText()));
thisItem.setPrice(driver.findElement("//xpathOfPrice[" i "]").getText()));
С помощью:
thisItem.setName(driver.findElements("//xpathOfName").get(i).getText()));
thisItem.setPrice(driver.findElements("//xpathOfPrice").get(i).getText()));
Комментарии:
1. Или начните с i = 0;
2. @pburgr Правильно!!! OP, похоже, управляет значением
i
динамически, поэтому сохранил положение, чтобы он мог выбрать желаемое значение.3. Спасибо! Я попробую это позже. Сначала нужно подготовиться к предстоящему экзамену.
4. Итак, я пересмотрел код сегодня и обнаружил, что предложенное решение неприменимо. Причина в том, что я сконструировал строку xpath таким образом, потому что html генерирует динамическое присвоение имен элементам (например, item1, item2, item3 ….).