Т.е. суть задачи в том, чтобы найти наибольшую дату и кликнуть потом по ссылке “Посмотреть”
Я понимаю, что надо как то вытащить значения элементов div там где дата, засунуть их в список и потом выбрать оттуда наибольшее значение, а вот как потом кликнуть на ссылку возле этой даты вообще нет идей…
Проблема в том, что я в программировании не силен ((
Пробовал сначала вытянуть значения дат вот так:
Привет.
Могу предложить следущее:
У тебя есть дата, которую ты достал из спика своего. Потом найди по XPath колонку. //td[preceding-sibling::tbody[descendant::div[text()='28.12.2015']]]
ну видимо у вас там аналогичные элементы есть, я же не видел полного html, написал по тому что вы показали в первом посте. Посмотрите в хроме-мозиле руками.
Я тут навоял, проверил, работает. Единственное что на Java и с библиотекой Selenide. Ну конкретно это решение не подойдет если на странице AJAX и в таблицу эту динамически добавляются строки, а если всё статическое то ок. Можешь по аналогии на свой язык переписать.
Вся логика в принципе в findRowWithTheBiggestData(), а видимый метод только один openLatestReport(). Конечно же не обязательно лепить под эту задачу целый класс, абсолютно всё тоже самое можно сделать в одном методе, но как-то не по феншую, да и навряд выйдет так чтобы ты через месяц понял как он работает.
В трех словах как тебе надо реализовать:
у тебя есть таблица, в таблице есть строки, получить список строк можно по xpath = //table/tbody[@style!=“display: none;”]/tr
в одной строке 2 значение, по первой колонке это дата, получить можем xpath-строки + ./td[not(contains(@class,‘clickable’))] , а по второй колонке у тебя собственно ссылка Посмотреть, получить можно xpath-строки + ./td[contains(@class,‘clickable’)]. Так вот, тебя надо пробежать по всем строкам с первой колонки, узнать где больше дата и записать в какой же ты строке нашел саму большую дату см как это делается в методе findRowWithTheBiggestData() там в принципе используется стандартный алгоритм “поиск максимального элемента в массиве”
Зная номер строки с самой большой датой просто взять кликнуть на Посмотреть.
Обращайся если нужны будут подробности
import com.codeborne.selenide.SelenideElement;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.openqa.selenium.By;
import java.util.List;
import static com.codeborne.selenide.Selenide.$$;
public class ReportTable {
/**
* получаем список строк таблицы
* */
private List<SelenideElement> getTableRows() {
return $$(By.xpath("//table/tbody[@style!=\"display: none;\"]/tr"));
}
/**
* по номеру строки таблицы выбираем SelenideElement колонки с датой
* */
private SelenideElement getDataColumnSelenideElement(int rowIndex) {
return getTableRows().get(rowIndex).$(By.xpath("./td[not(contains(@class,'clickable'))]"));
}
/**
* по номеру строки таблицы выбираем SelenideElement колонки с ссылкой
* */
private SelenideElement getLinkColumnSelenideElement(int rowIndex) {
return getTableRows().get(rowIndex).$(By.xpath("./td[contains(@class,'clickable')]"));
}
/**
* забираем дату из SelenideElement колонки с датой
* */
private DateTime getDataFromSelenideElementRow(SelenideElement rowWithDate) {
DateTimeFormatter dtf = DateTimeFormat.forPattern("dd.MM.yyyy");
return dtf.parseDateTime(rowWithDate.getText());
}
private int findRowWithTheBiggestData() {
int rowWithMaxDate = 0;
DateTime maxDate = getDataFromSelenideElementRow(getDataColumnSelenideElement(0));
for (int i = 0; i < getTableRows().size(); i++) {
DateTime currentDateInRow = getDataFromSelenideElementRow(getDataColumnSelenideElement(i));
if (maxDate.getMillis() < currentDateInRow.getMillis()) {
rowWithMaxDate = i;
maxDate = currentDateInRow;
}
}
return rowWithMaxDate;
}
/**
* собственно клик на "Посмотреть"
* */
public void openLatestReport() {
int rowIndex = findRowWithTheBiggestData();
getLinkColumnSelenideElement(rowIndex).$("div").click();
}
}