Codeception. Selectize (миграция к v2.0)

Привет всем :blush:
Столкнулась с selectize. И все никак не могу найти к нему подход… Стандартный SelectOption не подходит.

Код (случай, когда выбран один из контактов, в качестве значения берем его id, который я получаю в начале сценария, база данных MongoDb ):

 <form action="/quote/add/index.html" method="post" name="form" class="validate" id="form" novalidate="novalidate">
>          <div class="table">
>          <h2>Quote information</h2>
>          <div class="form_info">* Required Field(s)</div>
>          <div class="form clearfix">
>          <div class="col">
>          <div class="input">
>          <label for="idfields[contact_id]" class="required">
>                <span class="splabel">Contact:</span>
>          </label>
>              <select name="fields[contact_id]" id="iduser" required="required" tabindex="-1" class="selectized" style="display: none;"><option value="53a2e5095f80600012000012" selected="selected"></option></select><div class="selectize-control single"><div class="selectize-input items required has-options full has-items"><div data-value="53a2e5095f80600012000012" class="item">Miller</div><input type="text" autocomplete="off" tabindex="" style="width: 4px; opacity: 0; position: absolute; left: -10000px;"></div></div>
>            <label for="idfields[contact_id]" class="error" style="display: none;"></label>
>             </div>
>             <div class="input">
>             <label for="idfields[subject]" class="required">
>                  <span class="splabel">Subject:</span>
>             </label>
>             <input name="fields[subject]" type="text" required="required" value="">
>              <label for="idfields[subject]" class="error" style="display: none;">                
>              </label>
>               </div>

Как я пишу сценарий сейчас:

$I-> canSeeElement('#form');
$I-> submitForm('#form', array('fields[contact_id]' => $contact_id));
$I-> fillField("//input[@name='fields[subject]']", "Smth");

Получаю ошибку:

“Sorry, I couldn`t submit form “#form”, {“fields[contact_id]”:{”$id":“53a2e5095f80600012000012”}}:
Codeception\Exception\TestRuntime: Form with selector: “#form” was not found on given page.

@davert

Ок, судя по ошибке это достаточно старая версия Codeception. Сейчас используется ’Codeception\Exception\ElementNotFound’. Может конечно не в этом суть… Но всё равно. Скажите версию и скиньте конфиг acceptance.suite.yml

class_name: WebGuy
modules:
    enabled:
        - PhpBrowser
        - WebHelper
        - MongoDb
        - Selenium2
    config:
        PhpBrowser:
            url: 'http://project.linux/'
        Selenium2: 
            url: 'http://project.linux/'
            browser: firefox
        MongoDb:
            dsn: 'mongodb://192.168.10.170:27017/company_2'
            user: null
            password: null
            dump: tests/_data/company_2.js
            populate: true
            cleanup: true

Да, проект не обновляла к версии 2.0. У меня версия 1.8.5 (за апрель).

Решила обновить codeception к версии 2.0.1, скачала новый codecept.phar. Ввела php codecept.phar self-update и php composer.phar update codeception/codeception. А также php codecept.phar bootstrap и получила "Project already initialized at '.'
Но, как написано в Codeception Changelog переименований:

renamed _logs dir to _output by default
renamed _helpers dir to _support by default

не произошло. Что еще необходимо сделать?

О, ситуация прояняется!

Значит так. Вот что происходит. Модули PhpBrowser и Selenium2 имеют одинаковые названия методов, но работают по разному, PhpBrowser запускает тесты эмулируя работу браузера (без яваскрипта), а Selenium2 пускает Селениум. В чем беда: на каждый тест запускается 2 сессии. И всё может тоже не так и плохо, но весь ваш тест выполняется в Selenium2 не затрагивая PhpBrowser, кроме метода submitForm, который в Selenium2 отсутствует. Итого, получается, что submitForm работает не завися от Selenium2 и действительно не видит элемента на странице.

Итого, смотрите, что надо сделать.

  1. Убрать PhpBrowser из списка модулей. Если вы работаете с Selenium2 он вам вообще не нужен. Начиная с версии 2.1 Codeception будет ругаться матом, если вы будете добавлять модули с одинаковыми API (во избежание подобных ситуаций)
  2. Вместо модуля Selenium2 (его уже нет в версии 2.0) использовать WebDriver. Он работает на 90% так же как старый Selenium2, только в нем уже есть метод submitForm :smile:
  3. Для миграции к 2.0 ничего делать не надо. Нужно только выполнить codecept build, а дальше одно из двух: оно само заведется, или не заведется :slight_smile: Если не заведется - кидайте ошибку, постараюсь помочь. Но по идее для обноавления ничего не нужно - папки и классы переименовывать не надо, тесты править тоже, всё должно завестись как есть.

Забыла сразу написать, после ввода

codecept build 

получаю:

Building Actor classes for suites: acceptance, functional, unit 

[Codeception\Exception\Configuration]
AcceptanceHelper could not be found and loaded

build [-c|--config[="..."]]

В acceptance.suite.yml ввела следующие настройки теперь:

class_name: WebGuy
modules:
    enabled:
        - WebDriver
        - MongoDb
 config:
        WebDriver:
         url: 'http://project.linux/'
         browser: firefox
         window_size: 1024x768
         wait: 10
         capabilities:
             unexpectedAlertBehaviour: 'accept'

 MongoDb:
            dsn: 'mongodb://192.168.10.170:27017/company_2'
            user: null
            password: null
            dump: tests/_data/company_2.js
            populate: true
            cleanup: true

При запуске теста вижу, что версия обновилась

Codeception PHP Testing Framework v2.0.1

Но получаю ошибку:

Fatal error: Class 'Codeception/AbstractGuy' not found in ...\tests\acceptance\WebGuy.php on line 30

Т.е. прежний Guy у меня остался.

Т.е. прежний Guy у меня остался.

Выполните build, он перестроит Guy классы под версию 2.0

После выполнения build добавились новые методы в WebGuy, но также выскочило сообщение, что

  [Codeception\Exception\Configuration]
    Selenium could not be found and loaded. 

Хотя не указывала его в acceptance.suite.yml.

Если запускаю тесты без selenium.bat ( в котором у меня java -jar selenium-server-standalone-2.40.0.jar), то получаю сообщение:

[WebDriverCulrException]
Curl error thrown for http POST to http://127.0.0.1:4444/wd/hub/session with params: {"desiredCapabilities":{"unexpectedAlertBehaviour":"accept","browserName":"firefox"}
Failed connect to 127.0.0.1:4444; No error

Если же запускаю selenium.bat, то тест загружается, но ОЧЕНЬ медленно.

И что касается selectize, из-за чего все началось :smile: то

"Sorry, I couldn't submit form. 
ErrorException: Object of class RemoteWebElement could to be converted to string". 

Судя по ошибке - нет там селениума )

На каком этапе медленно?

Ох, тяжко-тяжко :frowning: Запустите тесты ещё раз с параметром -vvv и выложите сюда полный лог консоли.

Где-то по пол минуты запускается каждый fillField.