Имеется страница с ссылками(16 ссылок). Задача: поочередно кликнуть на каждую ссылку.
String testElement = "a[class='node node__leaf']"; //css selector
int numOfElements = $$(testElement).filter(Condition.visible).size(); //вычисляем сколько ссылок на странице(16)
for (int i = 0; i < numOfElements; i++) {
System.out.println(i + " - " + $$(testElement).filter(Condition.visible).get(i).getText()); //распечатываем i и кликаемую ссылку
$$(testElement).filter(Condition.visible).get(i).click(); // собственно сам клик
sleep(1); // Thread.sleep 1 сек для надежности
}
На выходе получаю, что при клике - пропускается один элемент и кликается через одну ссылку.
А что происходит после клика со страницей?
Возможно, фокус меняется, ваш слип вносит нестабильность.
Попробуйте тупо увеличить слип до 5 и посмотреть что будет, так не делали?
Думаю, проблема в том, что у вас на каждом шагу заново ищутся элементы через $$(testElement).filter(Condition.visible), а после клика, возможно, часть из них становится невидимой. Может быть чем-то закрываются, или совсем пропадают из dom.
А почему есть уверенность, что именно 16 находит, если судить по аутпуту то 8. Можно поставить System.out.println("links number " + numOfElements);, чтобы точно убедиться: 8 или 16.
Потому что физически на моей странице 16 ссылок, что и загоняется в переменную(numOfElements = 16) (links number 16) numOfElements по пути не меняется, оно служит выходом из цикла. По аутпуту 8, потому что при клике пропускается одна ссылка(вся суть проблемы). Как только selenide пытается кликнуть на 9ую ссылку - тест падает, потому что пропустились по одной ссылке(#2, #4, #6, #8)
Циклов = 16;
Элементов = 8; // потому что идет пропуск при клике
Если мое предположение верно, то нужно разобраться почему элементы становятся невидимыми. Возможно, после клика всплывает какой-то тултип поверх соседнего линка и скрывает его. Может быть нужно кликнуть куда-то в пустое место, чтобы тултип пропал.
Негибкий локатор. Вы задали очень точный класс для a -элемента, когда на него кликаете ему ещё прибавляется ещё один класс (расскрытый) и он уже не подходит к вашему локатору. По моему локатору находятся все элементы, раскрытые или ещё нет.
В Selenide тоже есть метод sleep, только с миллисекундами.
Вариант с секундами плох тем, что рано или поздно кто-то захочет подождать полсекунды - и дико обломится.