Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Работа с таблицей, нажатие кнопки в таблице

selenide
webdriver
Теги: #<Tag:0x00007f7b620897a8> #<Tag:0x00007f7b62089668>

(Антон Павлов) #1

Привет коллеги!
Не так давно начал изучать увлекательный мир программирования и автоматизации :sweat_smile:
И сейчас передо мной стала следующая задача:
Есть таблица с столбцами “Дата”, “Статус” и “Действие”.
Необходимо:
Обращаясь к дате, проверять статус дня и от статуса дня проверять валидность возможного действия.

Думаю считывать построчно и записывать в многомерный массив… Так я смогу проверить количество дней, сделать проверку статусов и действий.
Но также есть необходимость нажимать в столбце “Действие” на возможные действия… а как это сделать не знаю… может кто подскажет


(MaximDae) #2

Надо смотреть на код, но я похожую проблему решил через JS parentElement, так как стандартными средствами не смог определить элемент предшественник.


(Антон) #3

Создай кастомный HtmlElement (от Яндекса) - строку таблицы, с методами getDate(), getStatus(), calculate() ну и что тебе еще нужно…
Что-то похожее было тут:

Хотя не уверен что Selenide с HtmlElement рационально использовать :smile:


(Антон Павлов) #4

Таки да)) думаю что в Selenide есть более изящное решение )


(asolntsev) #5

Да, в Selenide есть изящное решение. :slight_smile:
Тут всё зависит от того, насколько вы контролируете тестируемое приложение.

Идеальный вариант - когда вы его полностью контролируете. То есть перед запуском тестов инициализируете данные в БД. То есть вы точно знаете, что должно быть на экране. Тогда так:

$$("#my-table .my-row").shouldHave(size(3));
$("#my-table .my-row", 0).shouldHave(text("29.11.2015", "Не рассчитан", "Рассчитать");
$("#my-table .my-row", 1).shouldHave(text("28.11.2015", "Рассчитан", "Скачать");
$("#my-table .my-row", 2).shouldHave(text("27.11.2015", "Х3", "Отменить");

Плохой вариант - когда вы не контролируете состояние приложения. Вы не знаете точно, что должно быть на экране. В таком случае вы обычно хотите найти строку, в которой есть, скажем, дата “28.11.2015”, найти в этой строке кнопку “Рассчитать” и нажать её. Сочувствую.
Но и это возможно. Примерно так:

SelenideElement day = $("#my-table").find(byText("29.11.2015"));
SelenideElement row = day.closest(".my-row");
SelenideElement button = row.find(byValue("Рассчитать"));
button.click();

(Антон Павлов) #7

Расскажу как я решил эту задачу :smile:

1)Получаю всю таблицу как SelenideElement

public static SelenideElement getAllTableBillingDayHistory() {
    return $(By.cssSelector("#billingDayHistory"));
}

2)Создаю класс для работы с этой таблицей, в котором:
а)Объявляю 4 переменные типа SelenideElement с названиями столбцов
б)Сетеры гетеры для этих переменных
в)Создаю метод в который передаю SelenideElement всю таблицу и выполняю след. операции:
-создаю ElementsCollection которому присваиваю таблицу построчно. 1 элемент 1 строка из таблицы
-создаю ElementsCollection в который в цикле буду буду заполнять ячейками из строки
-создаю List элементов объектов данного класса

В цикле делаю следующее:
-получаю из строки массив ячеек
-создаю объект данного класса
-распределяю эти ячейки
-добавляю объект данного класса в массив элементов данного класса

По итогу метод возвращает массив в котором каждый элемент это строка таблицы. И через гетеры можно получить любую ячейку

Ниже класс enum для указания порядкового номера ячейки