Пройтись по всем страницам пагинации не зная количество страниц

Приветствую! Задача проста: есть пагинация Вперед, Назад. Нужно при помощи codeception дойти до конечной страницы не завалив тест.
Конструкция $I->seeElement в случае, если Элемент не существует, вываливает Exception.

1 лайк

Есть проверочное $I->canSeeElement т.е. if ($I->canSeeElement(element)) { тара-ла-ла ;)}

Пример не на codeception, но идея должна быть понятна.

if (isEnabled(nextArrow)) { // or isPresent
    click(nextArrow);
}

П.С. Если думаете осуществлять подобное в цикле, придется предусмотреть еще условие ожидания появления элемента на странице.

Тут надо в try {} catch (Exception $e) {} оборачивать

Предполагается, что isPresent уже это предусматривает. :wink: Городить try / catch в пейджах будет слишком ugly.

try/catch однозначно не подходит.
Нужно что-то, что возвращает булево значение, тогда можно будет обернуть в do / while
$I->canSeeElement не вижу в описании webdriver WebDriver - Codeception - Documentation

Нашел описание $I->canSeeElement()
Не подходит

return    Conditional Assertion: Test won't be stopped on fail

Не правильно понял, тест не останавливается при такой проверке, но вызов возвращает null если элемент не виден.

$I->canSeeElement() то же что и $I->seeElement()

прописал ради интереса поиск по несуществующему элементу

$I->canSeeElement(['class'=>'test']);

Результат:

Couldn't see element {"class":"test"}:
Failed asserting that an array is not empty.

Scenario Steps:
4. I see element {"class":"test"}

Попробуй через ожидание элемента WebDriver - Codeception - Documentation

Единственный вариант, который надо попробовать, заюзать WebDriver - Codeception - Documentation

$isVisible = $I->executeJS(‘Проверка элемента JS’ом и return true\false’);
Дальше в цикле кликать Вперед, пока $element = true

Но это смахивает на костыль :slight_smile:

Не смахивает, это и есть костыль

waitForElementVisible упадет по таймауту, при этом параллельно ничего делать нельзя

В общем, решение с true / catch помогло. Создал CustomStep и добавил в него такую конструкцию

public function checkElement($locator) {
    $I = $this;
    try {
	    $I->seeElement($locator);
	    return true;
    } catch(\Exception $e){
	    return false;
    }
}

В тесте сейчас можно проверить наличие элемента

$element = new CustomStep();
$element->checkElement($locator);

вернет true\false в зависимости от наличия элемента на странице

Ну вот try/catch, а ты не хотел, хотя исходя из принципа построения тестов все должно быть линейно, но это не всегда так. Я из 270 тестах только в 2х поставил try/catch, ну никак без них не получилось. Использовать можно но как можно реже :wink:

я делал grabMultiple страниц пагинации и длина возвращаемого массива равнялась количеству страниц. Единственное, на той странице в пагинации отображались все странички, в вашем случае может быть не так.