Подскажите как реализовать такую конструкцию в 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 - это думаю тебе будет сейчас нужнее
Я балбес. Опишу подробней что я хочу. Я жму кнопку Edit - должна загрузится страница с настройками. Она может не загрузится если её кто-то редактировал но не сохранил, тогда будет показан текст и 2 кнопки Continue и Discard. Кнопки и текст могут быть не показаны, тогда загрузится страница с настройками.
Тогда такой вариант (я так использую), это проверка перед авторизацией, если авторизован то выйти и потом авторизация другим пользователем
$strk=$I->grabTextFrom(['class' => 'b-top-links-content']);
if (strpos($strk, 'Выйти') > 0) {
$I->click(['link' => 'Выйти']);
$I->seeLink('Вход');
}
Есть такое правило, что тест должен быть линейным и предсказуемым. Варианты: он будет вести себя так или так - не допустимы. В вашем случае лучше настроить данные таким образом, чтобы можно было проверить оба сценария: страница грузится обычно, страница грузится с черновика.
Любые ветвления в тестах чреваты непредсказуемым поведением. Допустим, тест 10 раз пройдет потому что будет идти по одной ветке, а потом упадет, потому что будет проверять несохраненные данные.
Попробовал использовать вашу конструкцию, только в моём случае не “!=” а “==”
if ($I->canSee(‘text’) == null) { $I->click(’’); }
тест проходит, но в отчёте всё равно пишет что FAILED, т.к случается что $I->canSee(‘text’) == null
Если конкретнее, то у меня проблема с раскрывающимся меню, т.е. если оно свёрнуто, то мне надо кликнуть по нему.
Дело в том что canSee() работает так: если был обнаружен элемент то все ОК или Фейл если он не был обнаружен, но при этом не прекращает выполнения теста.
Хорошо, но как мне построить конструкцию, чтоб в отчёте не было failed ?
Просто в AcceptanceHelper.php добавь функцию (имя ее от фонаря придумал)
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
Структура переделана, я сразу увидел
_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’);