Приветствую! Задача проста: есть пагинация Вперед, Назад. Нужно при помощи codeception дойти до конечной страницы не завалив тест.
Конструкция $I->seeElement в случае, если Элемент не существует, вываливает Exception.
Есть проверочное $I->canSeeElement т.е. if ($I->canSeeElement(element)) { тара-ла-ла ;)}
Пример не на codeception, но идея должна быть понятна.
if (isEnabled(nextArrow)) { // or isPresent
click(nextArrow);
}
П.С. Если думаете осуществлять подобное в цикле, придется предусмотреть еще условие ожидания появления элемента на странице.
Тут надо в try {} catch (Exception $e) {}
оборачивать
Предполагается, что isPresent
уже это предусматривает. Городить 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
$isVisible = $I->executeJS(‘Проверка элемента JS’ом и return true\false’);
Дальше в цикле кликать Вперед, пока $element = true
Но это смахивает на костыль
Не смахивает, это и есть костыль
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, ну никак без них не получилось. Использовать можно но как можно реже
я делал grabMultiple страниц пагинации и длина возвращаемого массива равнялась количеству страниц. Единственное, на той странице в пагинации отображались все странички, в вашем случае может быть не так.