2014-11-21 2 views
2

Я использую Behat для проверки страницы регистрации.
Эта страница содержит несколько полей с автозаполнением. Пользователь заполняет какое-либо значение в поле, страница ждет 500 миллисекунд, делает запрос ajax и отображает некоторые параметры вместе с соответствующим сообщением (элементы не найдены/найдено несколько элементов/найдено один элемент).Behat + норка, как проверить поле jQuery-ui autocomplete?

Я использую предопределенный шаг «заливает поля с значения» (пыталось использовать «заливаю значения для поля» вместо этого).
Следующий шаг является обычным, аналогично тому, как описано в documentation. Я просто ожидаю появления сообщения и проверьте, что он имеет правильный текст.

Но после заполнения поля Минка удаляет фокус с него, вызывая размытие Событие, которое нужно уволить на поле.
JQuery-ui очищает значение поля в ответ на это событие blur, поэтому после 500 миллисекунд поле пусто и запрос ajax прерывается.

Как исправить эту проблему?

Behat v2.5.0
норка v1.5.0
Норка-расширение v1.3.3
Jquery-щ v1.8.21
Селен v2.44.0

+0

https://github.com/Behat/MinkSelenium2Driver/blob/v1.1.1/src/Behat/Mink/Driver/Selenium2Driver.php#L615 Это причина моих бед - mink генерирует событие изменения в поле, поэтому я думаю, проблема в моем js. –

ответ

0

Решение ниже специфична для моего кода разметки, но должен легко адаптируется к вашим. Возможно, вам придется его модифицировать.

Предполагая, что вы выбрали автоматическую предложенную опцию в текстовом поле. Параметры автовыведения отображаются как <li> элементов после штрихов клавиатуры пользователя. <li> элемент представлен на странице, однако его содержимое пуст в начале, поэтому ничего не может быть выбрано behate. Чтобы решить проблему, не существующее содержимое между тегами <li> обернуто тегом <label>.

Типы пользователей в этой области авто Предложение:

<input name="brand" type="text" /> 

Где появляется самовнушение данные:

<ul> 
<li><label>{{ suggestion }}</label></li> 
</ul> 

Огурец:

When I fill in "brand" with "S" 
And I wait 1 seconds 
Then I select autosuggestion option "Sula" 
And I wait 1 seconds 
...... 

FeatureContext:

/** 
* @Given /^I wait (\d+) seconds$/ 
*/ 
public function iWaitSeconds($seconds) 
{ 
    sleep($seconds); 
} 

/** 
* @Then /^I select autosuggestion option "([^"]*)"$/ 
* 
* @param $text Option to be selected from autosuggestion 
* @throws \InvalidArgumentException 
*/ 
public function selectAutosuggestionOption($text) 
{ 
    $session = $this->getSession(); 
    $element = $session->getPage()->find(
     'xpath', 
     $session->getSelectorsHandler()->selectorToXpath('xpath', '*//*[text()="'. $text .'"]') 
    ); 

    if (null === $element) { 
     throw new \InvalidArgumentException(sprintf('Cannot find text: "%s"', $text)); 
    } 

    $element->click(); 
} 
+0

Спасибо за ответ. Моя разметка и шаги очень похожи, и проблема заключается в шаге «Когда я заполняю« бренд »« S ». Когда поле заполнено, оно теряет фокус, поэтому никакого аякс-запроса не производится, и нет нужды ждать сколько-нибудь секунд - значения не отображаются. –

+0

В моем случае нет проблемы с фокусом, и приведенный выше пример ожидает ответа, поэтому 'wait' должен быть на месте, но если у вас есть другой способ сделать что-то, вы можете изменить его по своему усмотрению. – BentCoder

+0

У моего коллеги тоже нет этой проблемы на его компьютере. Я пытался использовать те же версии selenium и firefox, но это не помогло. –

0
@Scenario: I'm stuck 
    Given I use jquery-ui-autocomplete 
    And I can not test it with behat 
    Then I trigger keyDown event like this: 
    """ 
    /** 
    * @When I select :entry after filling :value in :field 
    */ 
    public function iFillInSelectInputWithAndSelect($entry, $value, $field) 
    { 
     $page = $this->getSession()->getPage(); 
     $field = $this->fixStepArgument($field); 
     $value = $this->fixStepArgument($value); 
     $page->fillField($field, $value); 

     $element = $page->findField($field); 
     $this->getSession()->getDriver()->keyDown($element->getXpath(), '', null); 
     $this->getSession()->wait(500); 
     $chosenResults = $page->findAll('css', '.ui-autocomplete a'); 
     foreach ($chosenResults as $result) { 
      if ($result->getText() == $entry) { 
       $result->click(); 
       return; 
      } 
     } 
     throw new \Exception(sprintf('Value "%s" not found', $entry)); 
    } 
    """ 
Смежные вопросы