Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

codeception
php
Теги: #<Tag:0x00007f7b6d6c1b60> #<Tag:0x00007f7b6d6c1a20>

(Andrey Kurilov) #1

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


(Ray Romanov) #2

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


(Sergey Korol) #3

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

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

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


(Ray Romanov) #4

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


(Sergey Korol) #5

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


(Andrey Kurilov) #6

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


(Andrey Kurilov) #7

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

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

(Ray Romanov) #8

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


(Andrey Kurilov) #9

$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"}

(Ray Romanov) #10

Попробуй через ожидание элемента http://codeception.com/docs/modules/WebDriver#waitForElementVisible


(Andrey Kurilov) #11

Единственный вариант, который надо попробовать, заюзать http://codeception.com/docs/modules/WebDriver#executeJS

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

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


(Ray Romanov) #12

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


(Andrey Kurilov) #13

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


(Andrey Kurilov) #14

В общем, решение с 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 в зависимости от наличия элемента на странице


(Ray Romanov) #15

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


(Евгений Голов) #16

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