t.me/atinfo_chat Telegram группа по автоматизации тестирования

Codeception if else не могу понять как работает

Теги: #<Tag:0x00007f9afd322838>

Подскажите как реализовать такую конструкцию в acceptance тестах : if ($I->see(‘text’) { $I->click(’’); }. Полсе запуска теста if не отрабатывается

if ($I->canSee(‘text’) != null) { $I->click(’’); }

Спасибо, но не помогло
Мой код :
if ($I->canSee(‘We found your unsaved changes for this client’) != null) {
$I->click(’.//*[@value=“Ignore”]’);
}else{
$I->wait(3);
}

Погоди, а у тебя искомый элемент должен по любому появится или как?

По задумке я должен увидеть надпись ‘We found your unsaved changes for this client’ и нажать на кнопку
$I->click(’.//*[@value=“Ignore”]’); , если нет то просто подождать 3 сек чтобы страница загрузилась

Есть такие штуки как waitForText и waitForElementVisible работай с ними и обратное waitForElementNotVisible - это думаю тебе будет сейчас нужнее

1 Симпатия

Я балбес. Опишу подробней что я хочу. Я жму кнопку Edit - должна загрузится страница с настройками. Она может не загрузится если её кто-то редактировал но не сохранил, тогда будет показан текст и 2 кнопки Continue и Discard. Кнопки и текст могут быть не показаны, тогда загрузится страница с настройками.

Тогда такой вариант (я так использую), это проверка перед авторизацией, если авторизован то выйти и потом авторизация другим пользователем

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

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

Любые ветвления в тестах чреваты непредсказуемым поведением. Допустим, тест 10 раз пройдет потому что будет идти по одной ветке, а потом упадет, потому что будет проверять несохраненные данные.

2 Симпатий

Попробовал использовать вашу конструкцию, только в моём случае не “!=” а “==”
if ($I->canSee(‘text’) == null) { $I->click(’’); }
тест проходит, но в отчёте всё равно пишет что FAILED, т.к случается что $I->canSee(‘text’) == null
Если конкретнее, то у меня проблема с раскрывающимся меню, т.е. если оно свёрнуто, то мне надо кликнуть по нему.

Дело в том что canSee() работает так: если был обнаружен элемент то все ОК или Фейл если он не был обнаружен, но при этом не прекращает выполнения теста.

Хорошо, но как мне построить конструкцию, чтоб в отчёте не было failed ?

Просто в AcceptanceHelper.php добавь функцию (имя ее от фонаря придумал):smile:

 public function maybeSee($text, $selector = null) {
    $wb = $this->getModule('WebDriver')->webDriver;
    try {
        $wb->see($text, $selector);
        return TRUE;
    }   
    catch (Exception $e) {
        return FALSE;
    }
}

Писал на коленке, думаю принцип понятен (костыльный способ ;))
Вот ее и используй.

Спасибо, буду пробовать!

Прошу прощения за нубский вопрос, но я не могу найти AcceptanceHelper.php.Мне надо самому создать этот файл?

В папке _support находится

Возможно я не правильно развернул codeception ?

Ну вот у тебя версия 2.1 я пользуюсь 2.0
Структура переделана, я сразу увидел :wink:

_support/Helper/Acceptance.php

добавил эту функцию в класс
class Acceptance extends \Codeception\Module
когда доходит до строки
$wb->see($text, $selector);
в консоли появляется ошибка
Fatal error: Call to undefined method Facebook\WebDriver\Remote\RemoteWebDriver::see() in C:\xampp\htdocs\codeception2\tests_support\Helper\Acceptance.php on line 11 (line 11 это $wb->see($text, $selector);

Я ж говорил что на коленке писал (т.е. остальное доработать напильником).
Пробуй вместо
$wb = $this->getModule(‘WebDriver’)->webDriver;
поставить
$wb = $this->getModule(‘WebDriver’);

1 Симпатия