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

Проблема с поиском элеемента canseeInPageSource($id) + цикл while


(Incredible Eldrich) #1

Здравствуйте.
Есть слеющая задача: есть набор похожих элементов с аттрибутом <div id=“profile_cubes_list_item_$id”
Где $id это идентификатор из четырех чисел
Набор эелементов меняется по нажатию кнпоки Reshuffle.
Надо найти среди эелементов один с заданным цифровым идентификатором $id
То есть мне нужно нажимать кнопку Решафл пока искомый элемент не появится на странице.

Пробую решить так:

  while ($I->cantSeeInPageSource($id))  //Ищем идентификатор в сорсе страницы 
    {
        $I->click('Reshuffle'); // Жмем кнопку решафл, которая обновляет список элементов на странице
     }

Если изначально элемента на странице нету - то тест PASSED, если же элемент есть то получается ошибка:

PHP Fatal error:  Call to a member function findElements() on null in phar://D:/Projects/Codeception2/codecept.phar/src/Codeception/Module/WebDriver.php on line 376

Fatal error: Call to a member function findElements() on null in phar://D:/Projects/Codeception2/codecept.phar/src/Codeception/Module/WebDriver.php on line 376

FATAL ERROR. TESTS NOT FINISHED.
Call to a member function findElements() on null
in phar://D:/Projects/Codeception2/codecept.phar/src/Codeception/Module/WebDriver.php:376

Пробовал разные вариации условного оператора - успеха так и не добился. Ума не приложу что делать. В джаве подобная реализация усепешно работает через while (driver.getPageSource().contains(id)!=true) а в codeception не получается.

Заранее благодарен.


(Ray Romanov) #2

Вот пример как я проверяю авторизован или нет:

$strk=$I->grabTextFrom(['class' => 'b-top-links-content']);
if (strpos($strk, 'Выйти') > 0) {
    $I->click(['link' => 'Выйти']);
    $I->seeLink('Вход'); 
}

Т.е. в твоем случае, можно рассматривать так:

while (strpos($I->grabTextFrom('участок где должен быть искомый элемент'), $id) < 1) {
    $I->click('Reshuffle');
    $I->wait(1); // нужно если кнопка решафл через JS обрабатывается, можно и больше время поставить
}

Как-то так, но при условии что элемент видимый, и привязка идет к тому что отображается!!!


(Incredible Eldrich) #3

Спасибо, попробую. А почему не работает способ через cantSeeInPageSource($id)? я так понимаю он возвращает что то отличное от true/false?


(Incredible Eldrich) #4

А не работает он потому что метод cantSeeInPageSource($id) возвращает null если элемент присутсвует а не true/false как я думал. В джаве же подобная проверка возвращает true/false.
Однако запустить цикл так и не удалось.