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

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

webdriver
Теги: #<Tag:0x00007f7b68d57ee8>

(Андрей Майер) #1

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


(Ray Romanov) #2

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


(Андрей Майер) #3

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


(Ray Romanov) #4

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


(Андрей Майер) #5

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


(Ray Romanov) #6

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


(Андрей Майер) #7

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


(Ray Romanov) #8

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

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

(Michael Bodnarchuk) #9

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

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


(Ugin Berets) #10

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


(Ray Romanov) #11

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


(Ugin Berets) #12

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


(Ray Romanov) #13

Просто в 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;
    }
}

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


(Ugin Berets) #14

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


(Ugin Berets) #15

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


(Ray Romanov) #16

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


(Ugin Berets) #17

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


(Ray Romanov) #18

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

_support/Helper/Acceptance.php

(Ugin Berets) #19

добавил эту функцию в класс
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);


(Ray Romanov) #20

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