2014-11-21 5 views
2

Behat을 사용하여 등록 페이지를 테스트하고 있습니다.
이 페이지에는 자동 완성 기능이있는 몇 개의 필드가 있습니다. 사용자가 입력란에 값을 입력하면 페이지가 500 밀리 초 동안 기다리고 AJAX 요청을하고 관련 메시지 (항목이 없거나 여러 항목이 있거나 항목이 하나 있음)와 함께 몇 가지 옵션을 표시합니다. 내가 미리 정의 된 단계를 사용하고Behat + jquery-ui 자동 완성 필드를 테스트하는 방법을 밍크?

은 (대신 "나는필드 에 기입"사용하려고) "나는필드에 기입".
다음 단계는 documentation에 설명 된 것과 비슷한 맞춤식입니다. 메시지가 표시 될 때까지 기다렸다가 올바른 텍스트가 있는지 확인합니다.

필드를 채운 후 Mink는 포커스를 제거하여 블러를 이벤트가 필드에서 실행되도록합니다.
Jquery-ui는 블러 이벤트에 대한 응답으로 필드 값을 지 웁니다. 따라서 500 밀리 초 후에는 필드가 비어 있고 아약스 요청이 중단됩니다.

이 문제를 어떻게 해결할 수 있습니까? 아래

Behat의 v2.5.0
밍크 v1.5.0
밍크-확장 V1.3.3
JQuery와 - UI를 v1.8.21
셀레늄 v2.44.0

+0

https://github.com/Behat/MinkSelenium2Driver/blob/v1.1.1/src/Behat/Mink/Driver/Selenium2Driver.php#L615 이 내 문제의 이유입니다 - 밍크는 필드에서 변경 이벤트를 생성하므로 문제는 내 js에있는 것 같습니다. –

답변

0

솔루션 내 마크 업 코드에 고유해야하지만 당신에게 쉽게 적응할 수 있습니다. 수정해야 할 수도 있습니다.

텍스트 상자에서 자동 제안 옵션을 선택한다고 가정합니다. 사용자의 키 입력 후 자동 승인 옵션이 <li> 개 요소로 나타납니다. <li> 요소는 페이지에 표시되지만 내용이 처음에는 비어 있으므로 behat에 의해 선택 될 내용이 없습니다. 이 문제를 해결하기 위해 <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

제 동료는 자기 컴퓨터에도이 문제가 없습니다. 나는 같은 셀레늄과 파이어 폭스 버전을 사용하려했지만 도움이되지 않았다. –

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)); 
    } 
    """