Взаимодействие с элементами таблицы, создание коллекции блоков.

webdriver
java
selenium
selenide
Теги: #<Tag:0x00007fedbc5dfc08> #<Tag:0x00007fedbc5dfaa0> #<Tag:0x00007fedbc5df960> #<Tag:0x00007fedbc5df820>

#1

Добрый день.

Есть таблица с данными, линками и чекбоксом. По ходу тестов мне надо проверять данные в строке таблицы / открывать ее на редактирование и тп…

Я соорудил кастомный блок на подобии HtmlElement предствляющий собой строку таблицы, с getValue методами и кликами.

public class ScheduleInvoices extends ElementsContainer{
@FindBy(xpath = "//span[@class='rowCheckbox']")
private SelenideElement invoiceCheckbox;

@FindBy(xpath = "//a[@href and text()='Edit']")
private SelenideElement invoiceEditLink;

@FindBy(xpath = "//td[@class='checkboxColumn']/following-sibling::td[5]")
private SelenideElement invoiceNumber;

public void clickEdit() {
    invoiceEditLink.click();
}

public String getInvoiceNumber() {
    return invoiceNumber.getText();
}}

Немного непонятно как его инициализировать на “основной странице”. Сейчас я делаю это через page() метод.

public class SchedulesPage extends BasePage{    

private ScheduleInvoices invoicesList = page(ScheduleInvoices.class);

public void clickEdit() {
    invoicesList.clickEdit();

Так же меня интересует как создать коллекцию подобных блоков, чтобы можно было итерировать ее, например по invoiceNumber доставая из коллекции нужную строку. Если этот велосипед не поедет, выслушаю возможные, более оптимальные варианты. Спасибо.


(asolntsev) #2

Надо просто добавить поле этого типа в пэдж обжект. Метод page() и его инициализирует.

В тестах самого selenide есть такие примеры


#3

Да, спасибо, нашел в примерах кода как раз то, что надо. Вот только, не могу заставить работать.
Вот таблица описанная в классе ScheduleInvoices:

Страница со вставленным блоком:

public class SchedulesPage extends BasePage {   

@FindBy(xpath = "//table[@id='invoiceGrid']//tr")
public List<ScheduleInvoices> scheduleInvoices;
}

При обращении через
scheduleInvoices.get(0).clickEdit();

java выбрасывает ексепшен на пустой лист

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

При этом если я вместо List просто укажу тип поля

@FindBy(xpath = "//table[@id='invoiceGrid']//tr")
public ScheduleInvoices scheduleInvoices;

То, метод scheduleInvoices.clickEdit() отрабатывает, драйвер находит первое вхождение элемента и кликает на линку в таблице. Непонятно почему блоки не иницализируются в виде list.


(asolntsev) #4

Тут надо посмотреть. Может, действительно не инициализируются - тогда надо доработать.


(Roma Marinsky) #5

Сегодня или вчера вышел пул реквест для селенида с аннотацией FindAll ищет все вхождения, я как понял аналог для такой штуки: @FindBys(@FindBy(css = “”))
тоже ищет все вхождения FindBy

Получается ты не инициализируешь нужные для тебя коллекции элементов в ScheduleInvoices
То что должно быть коллекцией делай через ElementsCollection

@FindBy(xpath = “//table[@id=‘invoiceGrid’]//tr”) такой штукой ты проинициализировал одну строку в таблице инвойсГрид. Для начала найди таблицу инвйос грид, а в ней уже и ищи коллекцию строк