П.С. Возможно не так понял условие. Элемент изначально присутствует, а потом исчезает? Или его в принципе нет, но может появится, и нужно его дождаться?
Так чего вы в итоге пытаетесь добиться? Зафейлить тест при любых раскладах?
Нужно проверить что в календаре отображается от сегодняшней даты не более 45 дней, поэтому я сначала определяю дату, после к ней прибавляю 45 дней (получается 46), и кликаю на сгенерированный локатор, далее так как получается больше 45 дней падает ексепшн(так как такого локатора нет и быть не должно на странице) я его обрабатываю и кликаю на дату сегодня плюс 44 (получается 45,) если в блоке try сразу был локатор, то я закрывают драивер и далее падает тест в любом случае fail
я понимаю что так делать слишком сложно и можно сделать проще но не знаю как.
public void date(int days, int days2) {
String date = LocalDate.now().plusDays(days).format(DateTimeFormatter.ofPattern("yyy-MM-dd"));
try {
driver.findElement(By.cssSelector("[data-date='" + date + "']"));
driver.quit();
arrivCityInput.click();
} catch (Exception ex) {
String date2 = LocalDate.now().plusDays(days2).format(DateTimeFormatter.ofPattern("yyy-MM-dd"));
driver.findElement(By.cssSelector("[data-date='" + date2 + "']")).click();
}
}
Дело в том что локаторы, на странице разные
тоесть я не могу взять последний элемент например по $(’.day’) , а если искать последний по конкретной дате, то я его найду и возможно после него будет елемент 45 + дней
поэтому я пробую кликнуть на последний, сам генерирую тот которого заведомо не должно быть и ловлю ексепшн
public void date2(int days, int days2) {
waitForAjaxToFinish();
String date = LocalDate.now().plusDays(days).format(DateTimeFormatter.ofPattern("yyy-MM-dd"));
String date2 = LocalDate.now().plusDays(days2).format(DateTimeFormatter.ofPattern("yyy-MM-dd"));
Assert.assertEquals(driver.findElement(By.cssSelector("[data-date='" + date + "']")),driver.findElement(By.cssSelector("[data-date='" + date + "']")));
Еще раз… Зачем вам конкретная дата для поиска локатора?
Исходя из предложенной верстки, вам достаточно получить список дат через CSS + findElements, вытянуть последнюю из списка, а затем трансформировать в LocalDate для последующего ассерта:
LocalDate lastDate = findElements(css(".day:not(.disabled)")).stream()
.reduce((a, b) -> b)
.map(date -> LocalDate.parse(date, formatter))
.orElse(LocalDate.now());
П.С. Не помню точно, поддерживается ли not из коробки. Если нет, то можно JS’ом вытянуть, ну или xpath применить.
А причем здесь CSS? Суть в использовании findElements для получения всего списка доступных дат, а не findElement с неопределенностью. Локатор можно сформировать как угодно - хоть CSS’ом, хоть XPath’ом, хоть Sizzle.